From Philippe.DENIEL@CEA.FR Tue Jun 1 06:45:59 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o51Bjw8b249401 for ; Tue, 1 Jun 2010 06:45:58 -0500 X-ASG-Debug-ID: 1275393041-37a9038f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from oxalide-out.extra.cea.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 711F715810B2 for ; Tue, 1 Jun 2010 04:50:41 -0700 (PDT) Received: from oxalide-out.extra.cea.fr (oxalide-out.extra.cea.fr [132.168.224.1]) by cuda.sgi.com with ESMTP id 7JpYNcveo5qL24Yq for ; Tue, 01 Jun 2010 04:50:41 -0700 (PDT) Received: from pisaure.intra.cea.fr (pisaure.intra.cea.fr [132.166.88.21]) by oxalide.extra.cea.fr (8.14.2/8.14.2/CEAnet-Internet-out-2.0) with ESMTP id o51BmN74030845 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT) for ; Tue, 1 Jun 2010 13:48:23 +0200 Received: from muguet1.intra.cea.fr (muguet1.intra.cea.fr [132.166.192.6]) by pisaure.intra.cea.fr (8.14.4/8.14.4) with ESMTP id o51BmMfK018772 for ; Tue, 1 Jun 2010 13:48:22 +0200 (envelope-from Philippe.DENIEL@CEA.FR) Received: from zia.bruyeres.cea.fr (esteban.dam.intra.cea.fr [132.165.76.10]) by muguet1.intra.cea.fr (8.13.8/8.13.8/CEAnet-Intranet-out-1.1) with SMTP id o51BmMhh018938 for ; Tue, 1 Jun 2010 13:48:22 +0200 Received: (qmail 4856 invoked from network); 1 Jun 2010 11:48:22 -0000 Message-ID: <4C04F386.908@cea.fr> Date: Tue, 01 Jun 2010 13:48:22 +0200 From: DENIEL Philippe Organization: CEA-DAM User-Agent: Thunderbird 2.0.0.6 (X11/20070728) MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: xfsprogs/libhandle : How to get the handle for a symbolic link ? Subject: xfsprogs/libhandle : How to get the handle for a symbolic link ? Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 01 Jun 2010 11:48:22.0751 (UTC) FILETIME=[566B5EF0:01CB0180] X-Barracuda-Connect: oxalide-out.extra.cea.fr[132.168.224.1] X-Barracuda-Start-Time: 1275393042 X-Barracuda-Bayes: INNOCENT GLOBAL 0.3931 1.0000 -0.0178 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.02 X-Barracuda-Spam-Status: No, SCORE=-0.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31323 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi, I am currently developing a user space nfs server with various backends. One of this backend module use xfsprogss's libhandle to implement XFS support. I could do almost everything with open_by_handle and fd_to_handle, used jointly with ATFILE_SOURCE functions, but I do have a problem with symbolic links. To build an xfs object's handle, I get its parent handle (now problem to this) then I call "openat" to get the fd to the object before calling fd_to_handle. This works ok, but not for symbolic link : the openat with follow the link. I added the O_NOFOLLOW flag to openat, but now openat return ELOOP instead. I know there is a readlink_by_handle function in libhandle. How could I build the related handle to be used as argument to it (I mean, how to build a handle that refers to the symlink itself, not the object it points to). Regards Philippe From jack@suse.cz Tue Jun 1 10:52:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o51Fq88q004690 for ; Tue, 1 Jun 2010 10:52:08 -0500 X-ASG-Debug-ID: 1275407812-49b502ec0000-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 C4FA715828B9 for ; Tue, 1 Jun 2010 08:56:52 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id 8gPHGfDI5d5ot2FW for ; Tue, 01 Jun 2010 08:56:52 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 78A9493987; Tue, 1 Jun 2010 17:54:32 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 76B202B1BC8; Tue, 1 Jun 2010 17:54:17 +0200 (CEST) Date: Tue, 1 Jun 2010 17:54:17 +0200 From: Jan Kara To: Andrew Morton Cc: Dave Chinner , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, tytso@mit.edu, jens.axboe@oracle.com X-ASG-Orig-Subj: Re: [PATCH 6/6] writeback: limit write_cache_pages integrity scanning to current EOF Subject: Re: [PATCH 6/6] writeback: limit write_cache_pages integrity scanning to current EOF Message-ID: <20100601155417.GA7425@quack.suse.cz> References: <1274784852-30502-1-git-send-email-david@fromorbit.com> <1274784852-30502-7-git-send-email-david@fromorbit.com> <20100527143341.d4258798.akpm@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100527143341.d4258798.akpm@linux-foundation.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1275407813 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu 27-05-10 14:33:41, Andrew Morton wrote: > On Tue, 25 May 2010 20:54:12 +1000 > Dave Chinner wrote: > > > From: Dave Chinner > > > > sync can currently take a really long time if a concurrent writer is > > extending a file. The problem is that the dirty pages on the address > > space grow in the same direction as write_cache_pages scans, so if > > the writer keeps ahead of writeback, the writeback will not > > terminate until the writer stops adding dirty pages. > > > > The really was a pretty basic bug. It's writeback 101 to test that case :( The code has this live-lock since Nick fixed data integrity issues in write_cache_pages which was (digging) commit 05fe478d ("mm: write_cache_pages integrity fix") in January 2009. Jens just kept the code as it was... ... > That being said, I think the patch is insufficient. If I create an > enormous (possibly sparse) file with a 16TB hole (or a run of clean > pages) in the middle and then start busily writing into that hole (run > of clean pages), the problem will still occur. > > One obvious fix for that (a) would be to add another radix-tree tag and > do two passes across the radix-tree. > > Another fix (b) would be to track the number of dirty pages per > adddress_space, and only write that number of pages. > > Another fix would be to work out how the code handled this situation > before we broke it, and restore that in some fashion. I guess fix (b) > above kinda does that. (b) does not work for data integrity sync (see changelog of the above mentioned commit). I was sending a patch doing (a) in February but in particular you raised concerns whether it's not too expensive... Since it indeed has some cost (although I was not able to measure any performance impact) and I didn't know a better solution, I just postponed the patches. But I guess it's time to revive the series and maybe we'll get further with it. Honza -- Jan Kara SUSE Labs, CR From SRS0+7RX2+1+fromorbit.com=david@internode.on.net Tue Jun 1 18:26:55 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o51NQteH032111 for ; Tue, 1 Jun 2010 18:26:55 -0500 X-ASG-Debug-ID: 1275434959-37c201b80000-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 6B4051E038A4 for ; Tue, 1 Jun 2010 16:29:20 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id dvNL7nG5tWRyv8YN for ; Tue, 01 Jun 2010 16:29:20 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14806481-1927428 for multiple; Wed, 02 Jun 2010 08:59:18 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJatZ-0001kd-EQ; Wed, 02 Jun 2010 09:29:17 +1000 Date: Wed, 2 Jun 2010 09:29:17 +1000 From: Dave Chinner To: DENIEL Philippe Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfsprogs/libhandle : How to get the handle for a symbolic link ? Subject: Re: xfsprogs/libhandle : How to get the handle for a symbolic link ? Message-ID: <20100601232917.GG1395@dastard> References: <4C04F386.908@cea.fr> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C04F386.908@cea.fr> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1275434961 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0205 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31369 Rule breakdown below pts rule 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, Jun 01, 2010 at 01:48:22PM +0200, DENIEL Philippe wrote: > Hi, > > I am currently developing a user space nfs server with various > backends. One of this backend module use xfsprogss's libhandle to > implement XFS support. I could do almost everything with > open_by_handle and fd_to_handle, used jointly with ATFILE_SOURCE > functions, but I do have a problem with symbolic links. To build an > xfs object's handle, I get its parent handle (now problem to this) > then I call "openat" to get the fd to the object before calling > fd_to_handle. This works ok, but not for symbolic link : the openat > with follow the link. I added the O_NOFOLLOW flag to openat, but now > openat return ELOOP instead. > I know there is a readlink_by_handle function in libhandle. How > could I build the related handle to be used as argument to it (I > mean, how to build a handle that refers to the symlink itself, not > the object it points to). Doesn't path_to_handle() do what you want? From the man page: "... If the final component of the path name is a symbolic link, the handle returned is that of the link itself." Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+7RX2+1+fromorbit.com=david@internode.on.net Tue Jun 1 18:48:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o51NmpoY032997 for ; Tue, 1 Jun 2010 18:48:51 -0500 X-ASG-Debug-ID: 1275436413-07d201d90000-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 5D6BD1584CA7 for ; Tue, 1 Jun 2010 16:53:34 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id KKXwtUXcXCgAWjJF for ; Tue, 01 Jun 2010 16:53:34 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26383831-1927428 for multiple; Wed, 02 Jun 2010 09:21:12 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJbEl-0001mG-5R; Wed, 02 Jun 2010 09:51:11 +1000 Date: Wed, 2 Jun 2010 09:51:11 +1000 From: Dave Chinner To: Pedro =?iso-8859-1?Q?M=2E_L=F3pez?= Cc: Linux Kernel list , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: inconsistent lock state (2.6.34, XFS inode shrinker) Subject: Re: inconsistent lock state (2.6.34, XFS inode shrinker) Message-ID: <20100601235111.GH1395@dastard> References: <20100601121322.1e8f9edf@multimensaje.es> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20100601121322.1e8f9edf@multimensaje.es> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1275436416 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31369 Rule breakdown below pts rule 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, Jun 01, 2010 at 12:13:22PM +0200, Pedro M. López wrote: > ================================= > [ INFO: inconsistent lock state ] > 2.6.34 #1 > --------------------------------- > inconsistent {RECLAIM_FS-ON-W} -> {IN-RECLAIM_FS-W} usage. > kswapd0/227 [HC0[0]:SC0[0]:HE1:SE1] takes: > (&(&ip->i_iolock)->mr_lock#2){++++?+}, at: [] > xfs_ilock+0x27/0x79 {RECLAIM_FS-ON-W} state was registered at: > [] mark_held_locks+0x52/0x70 > [] lockdep_trace_alloc+0x85/0x9f > [] __alloc_pages_nodemask+0x7b/0x5b5 > [] grab_cache_page_write_begin+0x65/0xaa > [] block_write_begin+0x38/0xcd > [] xfs_vm_write_begin+0x25/0x27 > [] generic_file_buffered_write+0x114/0x271 > [] xfs_file_aio_write+0x4e1/0x70c > [] do_sync_write+0xc6/0x103 > [] vfs_write+0xad/0x172 > [] sys_write+0x45/0x6c > [] system_call_fastpath+0x16/0x1b > irq event stamp: 62175 > hardirqs last enabled at (62175): [] > _raw_spin_unlock_irqrestore+0x3a/0x60 hardirqs last disabled at > (62174): [] _raw_spin_lock_irqsave+0x17/0x58 softirqs > last enabled at (61572): [] __do_softirq+0x127/0x13e > softirqs last disabled at (61543): [] > call_softirq+0x1c/0x28 > > other info that might help us debug this: > 2 locks held by kswapd0/227: > #0: (shrinker_rwsem){++++..}, at: [] > shrink_slab+0x38/0x144 #1: (&xfs_mount_list_lock){++++.-}, at: > [] xfs_reclaim_inode_shrink+0x35/0x128 > > stack backtrace: > Pid: 227, comm: kswapd0 Not tainted 2.6.34 #1 > Call Trace: > [] print_usage_bug+0x1a4/0x1b5 > [] ? save_stack_trace+0x2a/0x47 > [] ? check_usage_forwards+0x0/0xcf > [] mark_lock+0x2ea/0x520 > [] __lock_acquire+0x6c1/0x1607 > [] ? radix_tree_delete+0xd1/0x1d0 > [] lock_acquire+0x57/0x6d > [] ? xfs_ilock+0x27/0x79 > [] down_write_nested+0x2a/0x4d > [] ? xfs_ilock+0x27/0x79 > [] xfs_ilock+0x27/0x79 > [] xfs_ireclaim+0x93/0xb1 > [] xfs_reclaim_inode+0x1de/0x20a > [] xfs_inode_ag_walk+0x8b/0xe6 > [] ? xfs_reclaim_inode+0x0/0x20a > [] xfs_inode_ag_iterator+0x80/0xd3 > [] ? xfs_reclaim_inode+0x0/0x20a > [] xfs_reclaim_inode_shrink+0x61/0x128 > [] shrink_slab+0xd3/0x144 > [] balance_pgdat+0x365/0x59b > [] ? isolate_pages_global+0x0/0x212 > [] kswapd+0x1f2/0x20f > [] ? autoremove_wake_function+0x0/0x34 > [] ? _raw_spin_unlock_irqrestore+0x5b/0x60 > [] ? kswapd+0x0/0x20f > [] kthread+0x7a/0x82 > [] kernel_thread_helper+0x4/0x10 > [] ? restore_args+0x0/0x30 > [] ? kthread+0x0/0x82 > [] ? kernel_thread_helper+0x0/0x10 It's a false positive introduced in 2.6.34 by the inode shrinker. That's one of several different false positive traces in 2.6.34, but I can't do anything about them because the shrinkers require global scope. The patches to customise the shrinker contexts (which avoids all of these warnings) will fix this.... You may as well not run lockdep on anything with an XFS filesystem, as these false positives will occur as soon as memory reclaim triggers and turn lockdep off. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Tue Jun 1 22:32:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o523W6g7044637 for ; Tue, 1 Jun 2010 22:32:06 -0500 X-ASG-Debug-ID: 1275449812-6c4602a90000-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 7092DA6914F; Tue, 1 Jun 2010 20:36:53 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id FJv0rr1kNaMjxsRm; Tue, 01 Jun 2010 20:36:53 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id C46E84966B6D; Tue, 1 Jun 2010 22:34:30 -0500 (CDT) Message-ID: <4C05D145.6080602@sandeen.net> Date: Tue, 01 Jun 2010 22:34:29 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 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: [xfs-masters] [PATCH 11/17] fs/xfs/quota: Add missing mutex_unlock Subject: Re: [xfs-masters] [PATCH 11/17] fs/xfs/quota: Add missing mutex_unlock 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: 1275449814 X-Barracuda-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.31385 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 Julia Lawall wrote: > From: Julia Lawall > > Add a mutex_unlock missing on the error path. The use of this lock is > balanced elsewhere in the file. > > The semantic match that finds this problem is as follows: > (http://coccinelle.lip6.fr/) > > // > @@ > expression E1; > @@ > > * mutex_lock(E1,...); > <+... when != E1 > if (...) { > ... when != E1 > * return ...; > } > ...+> > * mutex_unlock(E1,...); > // > > Signed-off-by: Julia Lawall > > --- > The use of ENOMEM rather than -ENOMEM is also a bit odd. All the xfs core code uses positive errors, it's an irix holdover. As things bubble up to the vfs interface, signs get switched. Yeah, it's a bit odd, but nobody dares change it ;) Maybe semantic patching could fix it ;) -Eric From SRS0+zB4A+2+fromorbit.com=david@internode.on.net Tue Jun 1 23:30:40 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o524Uduh047819 for ; Tue, 1 Jun 2010 23:30:40 -0500 X-ASG-Debug-ID: 1275453185-319102420000-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 5D85938D174 for ; Tue, 1 Jun 2010 21:33:05 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id kJg7tLlwfJlpTQfP for ; Tue, 01 Jun 2010 21:33:05 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26591548-1927428 for multiple; Wed, 02 Jun 2010 14:03:04 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJfdX-00020g-3k; Wed, 02 Jun 2010 14:33:03 +1000 Date: Wed, 2 Jun 2010 14:33:03 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 01/17] xfs: remove done roadmap item from xfs-delayed-logging-design.txt Subject: Re: [PATCH 01/17] xfs: remove done roadmap item from xfs-delayed-logging-design.txt Message-ID: <20100602043303.GA7011@dastard> References: <20100531160727.842750532@bombadil.infradead.org> <20100531160858.981686872@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100531160858.981686872@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1275453187 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31388 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 31, 2010 at 12:07:28PM -0400, Christoph Hellwig wrote: > Signed-off-by: Christoph Hellwig > > Index: xfs/Documentation/filesystems/xfs-delayed-logging-design.txt > =================================================================== > --- xfs.orig/Documentation/filesystems/xfs-delayed-logging-design.txt 2010-05-30 12:23:13.223254240 +0200 > +++ xfs/Documentation/filesystems/xfs-delayed-logging-design.txt 2010-05-30 12:23:57.363005673 +0200 > @@ -794,11 +794,6 @@ designed. > > Roadmap: > > -2.6.35 Inclusion in mainline as an experimental mount option > - => approximately 2-3 months to merge window > - => needs to be in xfs-dev tree in 4-6 weeks > - => code is nearing readiness for review > - > 2.6.37 Remove experimental tag from mount option > => should be roughly 6 months after initial merge > => enough time to: Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+WkSn+2+fromorbit.com=david@internode.on.net Tue Jun 1 23:37:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o524bYWV048106 for ; Tue, 1 Jun 2010 23:37:34 -0500 X-ASG-Debug-ID: 1275453741-6ffd03a70000-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 3B533130D504 for ; Tue, 1 Jun 2010 21:42:21 -0700 (PDT) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id CrTToBZTKCUzkyGp for ; Tue, 01 Jun 2010 21:42:21 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26385009-1927428 for multiple; Wed, 02 Jun 2010 14:09:59 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJfkD-00021F-PH; Wed, 02 Jun 2010 14:39:57 +1000 Date: Wed, 2 Jun 2010 14:39:57 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 02/17] xfs: skip writeback from reclaim context Subject: Re: [PATCH 02/17] xfs: skip writeback from reclaim context Message-ID: <20100602043957.GB7011@dastard> References: <20100531160727.842750532@bombadil.infradead.org> <20100531160859.184576507@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100531160859.184576507@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1275453743 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31389 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 31, 2010 at 12:07:29PM -0400, Christoph Hellwig wrote: > Allowing writeback from reclaim context causes massive problems with stack > overflows as we can call into the writeback code which tends to be a heavy > stack user both in the generic code and XFS from random contexts that > perform memory allocations. > > Follow the example of btrfs (and in slightly different form ext4) and refuse > to write out data from reclaim context. This issue should really be handled > by the VM so that we can tune better for this case, but until we get it > sorted out there we have to hack around this in each filesystem with a > complex writeback path. > > Signed-off-by: Christoph Hellwig Yup, I agree that we have to do this for the moment. It hasn't caused any problems in my usual OOM testing, so it seems safe to do. Reviewed-by: Dave Chinner Also worth thinking about is if should be checked in xfs_vm_releasepage() as well to avoid the same stack issues if it triggers allocation... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+WkSn+2+fromorbit.com=david@internode.on.net Tue Jun 1 23:39:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o524dAht048173 for ; Tue, 1 Jun 2010 23:39:11 -0500 X-ASG-Debug-ID: 1275453696-7972035e0000-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 5DFB01B15F47 for ; Tue, 1 Jun 2010 21:41:36 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id NBIQTD4PCfdti9tp for ; Tue, 01 Jun 2010 21:41:36 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26733856-1927428 for multiple; Wed, 02 Jun 2010 14:11:35 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJflm-00021N-Hj; Wed, 02 Jun 2010 14:41:34 +1000 Date: Wed, 2 Jun 2010 14:41:34 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 03/17] xfs: improve xfs_isilocked Subject: Re: [PATCH 03/17] xfs: improve xfs_isilocked Message-ID: <20100602044134.GC7011@dastard> References: <20100531160727.842750532@bombadil.infradead.org> <20100531160859.397431345@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100531160859.397431345@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1275453698 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31388 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 31, 2010 at 12:07:30PM -0400, Christoph Hellwig wrote: > Use rwsem_is_locked to make the assertations for shared locks work. > > Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+NbxA+2+fromorbit.com=david@internode.on.net Tue Jun 1 23:42:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o524gpJT048328 for ; Tue, 1 Jun 2010 23:42:52 -0500 X-ASG-Debug-ID: 1275454057-744d03630000-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 AB1EF130D5AD for ; Tue, 1 Jun 2010 21:47:38 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id MD83QNtFAVjYNs1V for ; Tue, 01 Jun 2010 21:47:38 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26283802-1927428 for multiple; Wed, 02 Jun 2010 14:15:16 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJfpK-00021m-Uo; Wed, 02 Jun 2010 14:45:14 +1000 Date: Wed, 2 Jun 2010 14:45:14 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 04/17] xfs: drop dmapi hooks Subject: Re: [PATCH 04/17] xfs: drop dmapi hooks Message-ID: <20100602044514.GD7011@dastard> References: <20100531160727.842750532@bombadil.infradead.org> <20100531160859.618170031@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100531160859.618170031@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1275454059 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0205 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31389 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 31, 2010 at 12:07:31PM -0400, Christoph Hellwig wrote: > Dmapi support was never merged upstream, but we still have a lot of hooks > bloating XFS for it, all over the fast pathes of the filesystem. > > This patch drops over 700 lines of dmapi overhead. If we'll ever get HSM > support in mainline at least the namespace events can be done much saner > in the VFS instead of the individual filesystem, so it's not like this > is much help for future work. > > Signed-off-by: Christoph Hellwig Looks pretty good to me, and it runs through QA just fine. There are still a couple of references to dmapi in comments, but I don't think that's a big issue. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+zB4A+2+fromorbit.com=david@internode.on.net Tue Jun 1 23:43:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o524hI9T048541 for ; Tue, 1 Jun 2010 23:43:18 -0500 X-ASG-Debug-ID: 1275453944-799c03540000-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 DF54B1B15FB7 for ; Tue, 1 Jun 2010 21:45:44 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id iGnCcf6JyckLZ01T for ; Tue, 01 Jun 2010 21:45:44 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26593015-1927428 for multiple; Wed, 02 Jun 2010 14:15:43 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJfpm-00021u-80; Wed, 02 Jun 2010 14:45:42 +1000 Date: Wed, 2 Jun 2010 14:45:42 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 05/17] xfs: remove unneeded #include statements Subject: Re: [PATCH 05/17] xfs: remove unneeded #include statements Message-ID: <20100602044542.GE7011@dastard> References: <20100531160727.842750532@bombadil.infradead.org> <20100531160900.057188886@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100531160900.057188886@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1275453945 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.31388 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 31, 2010 at 12:07:32PM -0400, Christoph Hellwig wrote: > Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+NbxA+2+fromorbit.com=david@internode.on.net Wed Jun 2 00:09:24 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5259Ov3052037 for ; Wed, 2 Jun 2010 00:09:24 -0500 X-ASG-Debug-ID: 1275455650-7b8000e20000-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 4D0DCAAA60E for ; Tue, 1 Jun 2010 22:14:11 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id bOvkKrQDDman5jrz for ; Tue, 01 Jun 2010 22:14:11 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26286577-1927428 for multiple; Wed, 02 Jun 2010 14:41:48 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJgF1-000241-6i; Wed, 02 Jun 2010 15:11:47 +1000 Date: Wed, 2 Jun 2010 15:11:47 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 06/17] xfs: simplify log item descriptor tracking Subject: Re: [PATCH 06/17] xfs: simplify log item descriptor tracking Message-ID: <20100602051147.GF7011@dastard> References: <20100531160727.842750532@bombadil.infradead.org> <20100531160900.319050257@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100531160900.319050257@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1275455652 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31391 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 31, 2010 at 12:07:33PM -0400, Christoph Hellwig wrote: > Currently we track log item descriptor belonging to a transaction using a > complex opencoded chunk allocator. This code has been there since day one > and seems to work around the lack of an efficient slab allocator. > > This patch replaces it with dynamically allocated log item descriptors > from a dedicated slab pool, linked to the transaction by a linked list. > > This allows to greatly simplify the log item descriptor tracking to the > point where it's just a couple hundred lines in xfs_trans.c instead of > a separate file. The external API has also been simplified while we're > at it - the xfs_trans_add_item and xfs_trans_del_item functions to add/ > delete items from a transaction have been simplified to the bare minium, > and the xfs_trans_find_item function is replaced with a direct dereference > of the li_desc field. All debug code walking the list of log items in > a transaction is down to a simple list_for_each_entry. > > Note that we could easily use a singly linked list here instead of the > double linked list from list.h as the fastpath only does deletion from > sequential traversal. But given that we don't have one available as > a library function yet I use the list.h functions for simplicity. > > [the patch applies ontop of Dave's delayed-logging branch] > > Signed-off-by: Christoph Hellwig Looks OK - nothing jumps out at me as being incorrect. I'm still running QA on it, but it looks good so far. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+WkSn+2+fromorbit.com=david@internode.on.net Wed Jun 2 00:11:57 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o525Bvgh052179 for ; Wed, 2 Jun 2010 00:11:57 -0500 X-ASG-Debug-ID: 1275455663-1b2400b10000-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 EC5DD1B15F6E for ; Tue, 1 Jun 2010 22:14:23 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id iutwIblgCFOLrJs9 for ; Tue, 01 Jun 2010 22:14:23 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14853167-1927428 for multiple; Wed, 02 Jun 2010 14:44:22 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJgHV-00024O-Fn; Wed, 02 Jun 2010 15:14:21 +1000 Date: Wed, 2 Jun 2010 15:14:21 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 07/17] xfs: merge iop_unpin_remove into iop_unpin Subject: Re: [PATCH 07/17] xfs: merge iop_unpin_remove into iop_unpin Message-ID: <20100602051421.GG7011@dastard> References: <20100531160727.842750532@bombadil.infradead.org> <20100531160900.602159529@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100531160900.602159529@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1275455664 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31390 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 31, 2010 at 12:07:34PM -0400, Christoph Hellwig wrote: > The unpin_remove item operation instances always share most of the > implementation with the respective unpin implementation. So instead > of keeping two different entry points add a remove flag to the unpin > operation and share the code more easily. > > Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+NbxA+2+fromorbit.com=david@internode.on.net Wed Jun 2 00:27:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o525RpQA053237 for ; Wed, 2 Jun 2010 00:27:51 -0500 X-ASG-Debug-ID: 1275456617-1b0d016e0000-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 BC7D3146E309 for ; Tue, 1 Jun 2010 22:30:17 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id tM1QovGrgOeEGABq for ; Tue, 01 Jun 2010 22:30:17 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26289080-1927428 for multiple; Wed, 02 Jun 2010 15:00:16 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJgWt-00025o-9Y; Wed, 02 Jun 2010 15:30:15 +1000 Date: Wed, 2 Jun 2010 15:30:15 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 08/17] xfs: give xfs_item_ops methods the correct prototypes Subject: Re: [PATCH 08/17] xfs: give xfs_item_ops methods the correct prototypes Message-ID: <20100602053015.GH7011@dastard> References: <20100531160727.842750532@bombadil.infradead.org> <20100531160900.816713118@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100531160900.816713118@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1275456618 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0014 1.0000 -2.0118 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.01 X-Barracuda-Spam-Status: No, SCORE=-2.01 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31392 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 31, 2010 at 12:07:35PM -0400, Christoph Hellwig wrote: > Stop the function pointer casting madness and give all the xfs_item_ops the > correct prototypes. > > Signed-off-by: Christoph Hellwig Nice cleanup. Long overdue. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+WkSn+2+fromorbit.com=david@internode.on.net Wed Jun 2 00:43:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o525h4XY054216 for ; Wed, 2 Jun 2010 00:43:05 -0500 X-ASG-Debug-ID: 1275457530-608200540000-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 D668638D2D7 for ; Tue, 1 Jun 2010 22:45:30 -0700 (PDT) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id F4BfzPUIntfx6X3W for ; Tue, 01 Jun 2010 22:45:30 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26393576-1927428 for multiple; Wed, 02 Jun 2010 15:15:29 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJglb-00026x-U8; Wed, 02 Jun 2010 15:45:27 +1000 Date: Wed, 2 Jun 2010 15:45:27 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 09/17] xfs: give li_cb callbacks the correct prototype Subject: Re: [PATCH 09/17] xfs: give li_cb callbacks the correct prototype Message-ID: <20100602054527.GI7011@dastard> References: <20100531160727.842750532@bombadil.infradead.org> <20100531160901.036824012@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100531160901.036824012@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1275457531 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0205 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31392 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 31, 2010 at 12:07:36PM -0400, Christoph Hellwig wrote: > Stop the function pointer casting madness and give all the li_cb instances > correct prototype. > > Signed-off-by: Christoph Hellwig This looks like it applies on top of my xfs_ifree_cluster() bug fix. Looks good, anyway. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+jH3i+2+fromorbit.com=david@internode.on.net Wed Jun 2 00:45:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o525jJhV054376 for ; Wed, 2 Jun 2010 00:45:19 -0500 X-ASG-Debug-ID: 1275457805-7bae02300000-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 8015BAAC466 for ; Tue, 1 Jun 2010 22:50:05 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id 3XaVk8ALi8x6NIcR for ; Tue, 01 Jun 2010 22:50:05 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26473316-1927428 for multiple; Wed, 02 Jun 2010 15:17:42 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJgnl-00027G-Cg; Wed, 02 Jun 2010 15:47:41 +1000 Date: Wed, 2 Jun 2010 15:47:41 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 10/17] xfs: simplify buffer pinning Subject: Re: [PATCH 10/17] xfs: simplify buffer pinning Message-ID: <20100602054741.GJ7011@dastard> References: <20100531160727.842750532@bombadil.infradead.org> <20100531160901.186403532@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100531160901.186403532@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1275457808 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31393 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 31, 2010 at 12:07:37PM -0400, Christoph Hellwig wrote: > Get rid of the xfs_buf_pin/xfs_buf_unpin/xfs_buf_ispin helpers and opencode > them in their only callers, just like we did for the inode pinning a while > ago. Also remove duplicate trace points - the bufitem tracepoints cover > all the information that is present in a buffer tracepoint. > > Signed-off-by: Christoph Hellwig Looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+WkSn+2+fromorbit.com=david@internode.on.net Wed Jun 2 00:55:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o525tLDI054842 for ; Wed, 2 Jun 2010 00:55:22 -0500 X-ASG-Debug-ID: 1275458267-608200d80000-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 55FE738D3B6 for ; Tue, 1 Jun 2010 22:57:48 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id 7zv1mJi2eLtzXoHn for ; Tue, 01 Jun 2010 22:57:48 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26434552-1927428 for multiple; Wed, 02 Jun 2010 15:27:47 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJgxV-00027l-FL; Wed, 02 Jun 2010 15:57:45 +1000 Date: Wed, 2 Jun 2010 15:57:45 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 11/17] xfs: simplify inode to transaction joining Subject: Re: [PATCH 11/17] xfs: simplify inode to transaction joining Message-ID: <20100602055745.GK7011@dastard> References: <20100531160727.842750532@bombadil.infradead.org> <20100531160901.401855518@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100531160901.401855518@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1275458269 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31394 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 31, 2010 at 12:07:38PM -0400, Christoph Hellwig wrote: > Currently we need to either call IHOLD or xfs_trans_ihold on an inode when > joining it to a transaction via xfs_trans_ijoin. > > This patches instead makes xfs_trans_ijoin usable on it's own by doing > an implicity xfs_trans_ihold, which also allows us to drop the third > argument. For the case where we want to hold a reference on the inode > a xfs_trans_ijoin_ref wrapper is added which does the IHOLD and marks > the inode for needing an xfs_iput. In addition to the cleaner interface > to the caller this also simplifies the implementation. > > Signed-off-by: Christoph Hellwig Can't say I'm fond of the xfs_trans_iget() setting of the lock flags, but that's a small price to pay forthe rest of the cleanup. So it looks good to me. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+WkSn+2+fromorbit.com=david@internode.on.net Wed Jun 2 00:59:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o525x1jZ055060 for ; Wed, 2 Jun 2010 00:59:02 -0500 X-ASG-Debug-ID: 1275458629-7f8f02630000-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 3C392AAC4D1 for ; Tue, 1 Jun 2010 23:03:49 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id 5DR5zOZwCxbusmw8 for ; Tue, 01 Jun 2010 23:03:49 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14860968-1927428 for multiple; Wed, 02 Jun 2010 15:31:27 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJh14-00028A-5R; Wed, 02 Jun 2010 16:01:26 +1000 Date: Wed, 2 Jun 2010 16:01:26 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 12/17] xfs: fix the xfs_log_iovec i_addr type Subject: Re: [PATCH 12/17] xfs: fix the xfs_log_iovec i_addr type Message-ID: <20100602060126.GL7011@dastard> References: <20100531160727.842750532@bombadil.infradead.org> <20100531160901.608320202@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100531160901.608320202@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1275458631 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.31393 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 31, 2010 at 12:07:39PM -0400, Christoph Hellwig wrote: > By making this member a void pointer we can get rid of a lot of pointless > casts. > > Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+zB4A+2+fromorbit.com=david@internode.on.net Wed Jun 2 00:59:40 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o525xdWw055121 for ; Wed, 2 Jun 2010 00:59:40 -0500 X-ASG-Debug-ID: 1275458525-5d9700f30000-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 9689F38D3D4 for ; Tue, 1 Jun 2010 23:02:06 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id P9Io6eDzoFlVBh4H for ; Tue, 01 Jun 2010 23:02:06 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26602863-1927428 for multiple; Wed, 02 Jun 2010 15:32:05 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJh1g-00028J-Is; Wed, 02 Jun 2010 16:02:04 +1000 Date: Wed, 2 Jun 2010 16:02:04 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 13/17] xfs: kill the unused xlog_debug variable Subject: Re: [PATCH 13/17] xfs: kill the unused xlog_debug variable Message-ID: <20100602060204.GM7011@dastard> References: <20100531160727.842750532@bombadil.infradead.org> <20100531160901.792538953@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100531160901.792538953@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1275458527 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0002 1.0000 -2.0198 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31394 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 31, 2010 at 12:07:40PM -0400, Christoph Hellwig wrote: > Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+zB4A+2+fromorbit.com=david@internode.on.net Wed Jun 2 01:00:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5260JEA055186 for ; Wed, 2 Jun 2010 01:00:19 -0500 X-ASG-Debug-ID: 1275458565-47fc00bb0000-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 F2E101B160A3 for ; Tue, 1 Jun 2010 23:02:45 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id 7FToo9ei6Aqu8WBz for ; Tue, 01 Jun 2010 23:02:45 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26603013-1927428 for multiple; Wed, 02 Jun 2010 15:32:45 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJh2K-00028W-7s; Wed, 02 Jun 2010 16:02:44 +1000 Date: Wed, 2 Jun 2010 16:02:44 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 14/17] xfs: remove the unused XFS_LOG_SLEEP and XFS_LOG_NOSLEEP flags Subject: Re: [PATCH 14/17] xfs: remove the unused XFS_LOG_SLEEP and XFS_LOG_NOSLEEP flags Message-ID: <20100602060244.GN7011@dastard> References: <20100531160727.842750532@bombadil.infradead.org> <20100531160901.981749888@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100531160901.981749888@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1275458567 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.31394 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 31, 2010 at 12:07:41PM -0400, Christoph Hellwig wrote: > Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+qEu4+2+fromorbit.com=david@internode.on.net Wed Jun 2 01:00:48 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5260mkW055213 for ; Wed, 2 Jun 2010 01:00:48 -0500 X-ASG-Debug-ID: 1275458594-5d9401360000-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 39A0338D3DE for ; Tue, 1 Jun 2010 23:03:15 -0700 (PDT) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id BxdaMFYabPZ54gzu for ; Tue, 01 Jun 2010 23:03:15 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26333162-1927428 for multiple; Wed, 02 Jun 2010 15:33:14 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJh2m-00028d-Tn; Wed, 02 Jun 2010 16:03:12 +1000 Date: Wed, 2 Jun 2010 16:03:12 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 15/17] xfs: remove the unused XFS_TRANS_NOSLEEP/XFS_TRANS_WAIT flags Subject: Re: [PATCH 15/17] xfs: remove the unused XFS_TRANS_NOSLEEP/XFS_TRANS_WAIT flags Message-ID: <20100602060312.GO7011@dastard> References: <20100531160727.842750532@bombadil.infradead.org> <20100531160902.179351623@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100531160902.179351623@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1275458596 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0002 1.0000 -2.0199 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31394 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 31, 2010 at 12:07:42PM -0400, Christoph Hellwig wrote: > Signed-off-by: Christoph Hellwig > Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+jH3i+2+fromorbit.com=david@internode.on.net Wed Jun 2 01:02:04 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o52624L3055281 for ; Wed, 2 Jun 2010 01:02:04 -0500 X-ASG-Debug-ID: 1275458669-1b26029f0000-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 AEA591B160B6 for ; Tue, 1 Jun 2010 23:04:30 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id O2gDnBge1B3TFogN for ; Tue, 01 Jun 2010 23:04:30 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26475807-1927428 for multiple; Wed, 02 Jun 2010 15:34:26 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJh3x-00028l-4X; Wed, 02 Jun 2010 16:04:25 +1000 Date: Wed, 2 Jun 2010 16:04:25 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 16/17] xfs: remove unused XFS_BMAPI_ flags Subject: Re: [PATCH 16/17] xfs: remove unused XFS_BMAPI_ flags Message-ID: <20100602060425.GP7011@dastard> References: <20100531160727.842750532@bombadil.infradead.org> <20100531160902.372281460@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100531160902.372281460@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1275458671 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.31394 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 31, 2010 at 12:07:43PM -0400, Christoph Hellwig wrote: > Signed-off-by: Christoph Hellwig > Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+WkSn+2+fromorbit.com=david@internode.on.net Wed Jun 2 01:09:14 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5269DQt055609 for ; Wed, 2 Jun 2010 01:09:13 -0500 X-ASG-Debug-ID: 1275459240-7bb102f80000-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 8EA55AAC50D for ; Tue, 1 Jun 2010 23:14:01 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id aCwgqvcKFlLeGJhH for ; Tue, 01 Jun 2010 23:14:01 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 14862743-1927428 for multiple; Wed, 02 Jun 2010 15:41:38 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJhAv-00029P-J5; Wed, 02 Jun 2010 16:11:37 +1000 Date: Wed, 2 Jun 2010 16:11:37 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 17/17] xfs: remove unused delta tracking code in xfs_bmapi Subject: Re: [PATCH 17/17] xfs: remove unused delta tracking code in xfs_bmapi Message-ID: <20100602061137.GQ7011@dastard> References: <20100531160727.842750532@bombadil.infradead.org> <20100531160902.541889062@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100531160902.541889062@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1275459242 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31395 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 31, 2010 at 12:07:44PM -0400, Christoph Hellwig wrote: > This code was introduced four years ago in commit > 3e57ecf640428c01ba1ed8c8fc538447ada1715b without any review and has > been unused since. Remove it just as the rest of the code introduced > in that commit to reduce that stack usage and complexity in this central > piece of code. > > Signed-off-by: Christoph Hellwig Agreed. if we have need for it in the future, it's there in revision history. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+WkSn+2+fromorbit.com=david@internode.on.net Wed Jun 2 01:11:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o526BTj4055732 for ; Wed, 2 Jun 2010 01:11:29 -0500 X-ASG-Debug-ID: 1275459376-7ba8030f0000-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 AFB8D130D447 for ; Tue, 1 Jun 2010 23:16:17 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id x2kolfaHNZHXm8zF for ; Tue, 01 Jun 2010 23:16:17 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26437300-1927428 for multiple; Wed, 02 Jun 2010 15:43:54 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJhD7-00029a-Sh; Wed, 02 Jun 2010 16:13:53 +1000 Date: Wed, 2 Jun 2010 16:13:53 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 00/17] pending patches Subject: Re: [PATCH 00/17] pending patches Message-ID: <20100602061353.GR7011@dastard> References: <20100531160727.842750532@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100531160727.842750532@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1275459378 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31395 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 31, 2010 at 12:07:27PM -0400, Christoph Hellwig wrote: > Here's my list of pending patches. Ordering them is getting a bit > difficult as various patches that have been out of a while haven't > been commited yet. Note that some patches require Dave's > > [PATCH] xfs: fix race in inode cluster freeing failing to stale inodes > > applies first. That patch is a clear candidate for something that > should go to Linus ASAP IHMO. That's a fine set of cleanups, Christoph: 79 files changed, 974 insertions(+), 3106 deletions(-) I'm still running it through QA. If it survives another day or so I'll push them all out into my git tree for Alex.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From Philippe.DENIEL@CEA.FR Wed Jun 2 02:18:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_34, J_CHICKENPOX_44 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o527I609059484 for ; Wed, 2 Jun 2010 02:18:07 -0500 X-ASG-Debug-ID: 1275463232-0d1d00c00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from oxalide-out.extra.cea.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 08BFA38D45E for ; Wed, 2 Jun 2010 00:20:32 -0700 (PDT) Received: from oxalide-out.extra.cea.fr (oxalide-out.extra.cea.fr [132.168.224.1]) by cuda.sgi.com with ESMTP id SY3BLFwflE14oPsy for ; Wed, 02 Jun 2010 00:20:32 -0700 (PDT) Received: from pisaure.intra.cea.fr (pisaure.intra.cea.fr [132.166.88.21]) by oxalide.extra.cea.fr (8.14.2/8.14.2/CEAnet-Internet-out-2.0) with ESMTP id o527KVUf010946 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT) for ; Wed, 2 Jun 2010 09:20:32 +0200 Received: from muguet2.intra.cea.fr (muguet2.intra.cea.fr [132.166.192.7]) by pisaure.intra.cea.fr (8.14.4/8.14.4) with ESMTP id o527KVZ6016446 for ; Wed, 2 Jun 2010 09:20:31 +0200 (envelope-from Philippe.DENIEL@CEA.FR) Received: from zia.bruyeres.cea.fr (esteban.dam.intra.cea.fr [132.165.76.10]) by muguet2.intra.cea.fr (8.13.8/8.13.8/CEAnet-Intranet-out-1.1) with SMTP id o527KVmU000600 for ; Wed, 2 Jun 2010 09:20:31 +0200 Received: (qmail 22560 invoked from network); 2 Jun 2010 07:20:31 -0000 Message-ID: <4C06063F.1000609@cea.fr> Date: Wed, 02 Jun 2010 09:20:31 +0200 From: DENIEL Philippe Organization: CEA-DAM User-Agent: Thunderbird 2.0.0.6 (X11/20070728) MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfsprogs/libhandle : How to get the handle for a symbolic link ? Subject: Re: xfsprogs/libhandle : How to get the handle for a symbolic link ? References: <4C04F386.908@cea.fr> <20100601232917.GG1395@dastard> In-Reply-To: <20100601232917.GG1395@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit X-OriginalArrivalTime: 02 Jun 2010 07:20:31.0710 (UTC) FILETIME=[15BEDFE0:01CB0224] X-Barracuda-Connect: oxalide-out.extra.cea.fr[132.168.224.1] X-Barracuda-Start-Time: 1275463234 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0002 1.0000 -2.0200 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31399 Rule breakdown below pts rule 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 Dave, In fact, path_to_handle does not do the work correctly. Its code is this (extract from xfsprogs-3.0.3 sources) : int path_to_handle( char *path, /* input, path to convert */ void **hanp, /* output, pointer to data */ size_t *hlen) /* output, size of returned data */ { int fd; int result; comarg_t obj; fd = open(path, O_RDONLY); if (fd < 0) return -1; obj.path = path; result = obj_to_handle(path, fd, XFS_IOC_PATH_TO_HANDLE, obj, hanp, hlen); close(fd); return result; } As you see, it performs a open at the beginning, which will results in opening the file pointed by the symlink or returns ENOENT if the path "inside" the symlink does not exist. I tried using open with O_NOFOLLOW option, but it changed nothing, I got ELOOP when opening the file (which is a regular behavior so far). Any other ideas ? Philippe Dave Chinner a écrit : > On Tue, Jun 01, 2010 at 01:48:22PM +0200, DENIEL Philippe wrote: > >> Hi, >> >> I am currently developing a user space nfs server with various >> backends. One of this backend module use xfsprogss's libhandle to >> implement XFS support. I could do almost everything with >> open_by_handle and fd_to_handle, used jointly with ATFILE_SOURCE >> functions, but I do have a problem with symbolic links. To build an >> xfs object's handle, I get its parent handle (now problem to this) >> then I call "openat" to get the fd to the object before calling >> fd_to_handle. This works ok, but not for symbolic link : the openat >> with follow the link. I added the O_NOFOLLOW flag to openat, but now >> openat return ELOOP instead. >> I know there is a readlink_by_handle function in libhandle. How >> could I build the related handle to be used as argument to it (I >> mean, how to build a handle that refers to the symlink itself, not >> the object it points to). >> > > Doesn't path_to_handle() do what you want? From the man page: > > "... If the final component of the path name is a symbolic > link, the handle returned is that of the link itself." > > Cheers, > > Dave. > From BATV+e0e2c835e84ac9826b58+2474+infradead.org+hch@bombadil.srs.infradead.org Wed Jun 2 05:04:21 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o52A4KfF068036 for ; Wed, 2 Jun 2010 05:04:21 -0500 X-ASG-Debug-ID: 1275473207-101903390000-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 3466B38DDC2 for ; Wed, 2 Jun 2010 03:06:47 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 75aYU0pDwRt3ItQO for ; Wed, 02 Jun 2010 03:06:47 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OJkqM-0006Uf-3J; Wed, 02 Jun 2010 10:06:38 +0000 Date: Wed, 2 Jun 2010 06:06:38 -0400 From: Christoph Hellwig To: DENIEL Philippe Cc: Dave Chinner , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfsprogs/libhandle : How to get the handle for a symbolic link ? Subject: Re: xfsprogs/libhandle : How to get the handle for a symbolic link ? Message-ID: <20100602100637.GA24014@infradead.org> References: <4C04F386.908@cea.fr> <20100601232917.GG1395@dastard> <4C06063F.1000609@cea.fr> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C06063F.1000609@cea.fr> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1275473208 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, Jun 02, 2010 at 09:20:31AM +0200, DENIEL Philippe wrote: > Hi Dave, > > In fact, path_to_handle does not do the work correctly. Its code is this > (extract from xfsprogs-3.0.3 sources) : This is fixed as of xfsprogs 3.1.0. I would recommend to update to the latests xfsprogs (3.1.2) anyway. From BATV+e0e2c835e84ac9826b58+2474+infradead.org+hch@bombadil.srs.infradead.org Wed Jun 2 05:05:50 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o52A5oYp068081 for ; Wed, 2 Jun 2010 05:05:50 -0500 X-ASG-Debug-ID: 1275473298-268700760000-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 9F6E01B167C0 for ; Wed, 2 Jun 2010 03:08:18 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 7iDfVkA1eUNqtMPh for ; Wed, 02 Jun 2010 03:08:18 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OJkrs-0006k0-U5; Wed, 02 Jun 2010 10:08:12 +0000 Date: Wed, 2 Jun 2010 06:08:12 -0400 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 02/17] xfs: skip writeback from reclaim context Subject: Re: [PATCH 02/17] xfs: skip writeback from reclaim context Message-ID: <20100602100812.GA25035@infradead.org> References: <20100531160727.842750532@bombadil.infradead.org> <20100531160859.184576507@bombadil.infradead.org> <20100602043957.GB7011@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100602043957.GB7011@dastard> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1275473298 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, Jun 02, 2010 at 02:39:57PM +1000, Dave Chinner wrote: > Also worth thinking about is if should be checked in > xfs_vm_releasepage() as well to avoid the same stack issues if it > triggers allocation... I agree this is a potential problem as well. I did some QA runs with this thrown in, and it causes massive OOM killer wreckage in xfstests. I've also cross-checked btrfs and ext4 and neither one skips ->releasepage from reclaim context. From a.asawaroengchai@sussex.ac.uk Wed Jun 2 07:31:55 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o52CVsoq076886 for ; Wed, 2 Jun 2010 07:31:55 -0500 X-ASG-Debug-ID: 1275482059-26a103dd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from chip.uscs.susx.ac.uk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3CECF1D5552B for ; Wed, 2 Jun 2010 05:34:19 -0700 (PDT) Received: from chip.uscs.susx.ac.uk (chip.uscs.susx.ac.uk [139.184.14.86]) by cuda.sgi.com with ESMTP id JNeuXYgawO66AnKr for ; Wed, 02 Jun 2010 05:34:19 -0700 (PDT) Received: from pactbook.pact.cpes.susx.ac.uk ([139.184.130.15]:49919) by chip.uscs.susx.ac.uk with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.64) (envelope-from ) id L3E0EC-000LVM-26 for xfs@oss.sgi.com; Wed, 02 Jun 2010 13:37:24 +0100 Message-ID: <4C064FC6.5050401@sussex.ac.uk> Date: Wed, 02 Jun 2010 13:34:14 +0100 From: Albert Asawaroengchai User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: xfs_quota timer Subject: xfs_quota timer X-Enigmail-Version: 1.0.1 Content-Type: multipart/mixed; boundary="------------090309090803020002090605" X-Sussex: true X-Sussex-transport: remote_smtp_rew X-Barracuda-Connect: chip.uscs.susx.ac.uk[139.184.14.86] X-Barracuda-Start-Time: 1275482060 X-Barracuda-Bayes: INNOCENT GLOBAL 0.1655 1.0000 -1.0145 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.01 X-Barracuda-Spam-Status: No, SCORE=-1.01 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31419 Rule breakdown below pts rule 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 a multi-part message in MIME format. --------------090309090803020002090605 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Hi, I'm trying to set the timer for a filesystem, but I don't understand how to use the syntax. xfs_quota -x -c 'timer 1w user' /target/filesystem The above doesn't seem to work, can anyone give advice or point me in the right direction? Many thanks, Albert --------------090309090803020002090605 Content-Type: text/x-vcard; charset=utf-8; name="a_asawaroengchai.vcf" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="a_asawaroengchai.vcf" begin:vcard fn:Albert Asawaroengchai n:Asawaroengchai;Albert org:University of Sussex;Physics and Astronomy adr:;;;Brighton;East Sussex;BN1 9QH;United Kingdom email;internet:a.asawaroengchai@sussex.ac.uk title:UNIX System Administrator tel;work:+44 (0)1273 873059 url:http://www.pact.cpes.susx.ac.uk/ version:2.1 end:vcard --------------090309090803020002090605-- From SRS0+WkSn+2+fromorbit.com=david@internode.on.net Wed Jun 2 17:59:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o52Mxo1P116549 for ; Wed, 2 Jun 2010 17:59:51 -0500 X-ASG-Debug-ID: 1275519736-567d027d0000-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 8BB4813F4063 for ; Wed, 2 Jun 2010 16:02:16 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id mx3tADeQGqlDmsqQ for ; Wed, 02 Jun 2010 16:02:16 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26521294-1927428 for multiple; Thu, 03 Jun 2010 08:32:15 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJwwr-0003LT-6F; Thu, 03 Jun 2010 09:02:09 +1000 Date: Thu, 3 Jun 2010 09:02:09 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 02/17] xfs: skip writeback from reclaim context Subject: Re: [PATCH 02/17] xfs: skip writeback from reclaim context Message-ID: <20100602230209.GA27325@dastard> References: <20100531160727.842750532@bombadil.infradead.org> <20100531160859.184576507@bombadil.infradead.org> <20100602043957.GB7011@dastard> <20100602100812.GA25035@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100602100812.GA25035@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1275519738 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31459 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Jun 02, 2010 at 06:08:12AM -0400, Christoph Hellwig wrote: > On Wed, Jun 02, 2010 at 02:39:57PM +1000, Dave Chinner wrote: > > Also worth thinking about is if should be checked in > > xfs_vm_releasepage() as well to avoid the same stack issues if it > > triggers allocation... > > I agree this is a potential problem as well. > > I did some QA runs with this thrown in, and it causes massive OOM killer > wreckage in xfstests. I've also cross-checked btrfs and ext4 and > neither one skips ->releasepage from reclaim context. Did you skip it unconditionally, or only when a transaction was required? The scary part is that I've seen stack traces (i.e. most stack used) through this reclaim path for delalloc conversion even for allocations that are GFP_NOFS and the only thing saving us from deadlocks is th PF_FSTRANS check. Even worse is that shrinker_page_list() will call try_to_release_pages() without checking whether it's allowed to enter the filesystem or not, so we can be doing block allocation in places we've specifically told the memory allocation subsystem not to.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+qEu4+2+fromorbit.com=david@internode.on.net Wed Jun 2 18:51:00 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o52Np09Y120277 for ; Wed, 2 Jun 2010 18:51:00 -0500 X-ASG-Debug-ID: 1275522807-72a502090000-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 D97301B1941C for ; Wed, 2 Jun 2010 16:53:27 -0700 (PDT) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id mmUavHm7Tsi2B2K1 for ; Wed, 02 Jun 2010 16:53:27 -0700 (PDT) Received: from dastard (unverified [121.45.174.97]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26423341-1927428 for multiple; Thu, 03 Jun 2010 09:23:26 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OJxkT-0003PP-D0; Thu, 03 Jun 2010 09:53:25 +1000 Date: Thu, 3 Jun 2010 09:53:25 +1000 From: Dave Chinner To: Albert Asawaroengchai Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_quota timer Subject: Re: xfs_quota timer Message-ID: <20100602235325.GB8287@dastard> References: <4C064FC6.5050401@sussex.ac.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C064FC6.5050401@sussex.ac.uk> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1275522808 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0007 1.0000 -2.0166 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31462 Rule breakdown below pts rule 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, Jun 02, 2010 at 01:34:14PM +0100, Albert Asawaroengchai wrote: > Hi, > > I'm trying to set the timer for a filesystem, but I don't understand how > to use the syntax. > > xfs_quota -x -c 'timer 1w user' /target/filesystem > > The above doesn't seem to work, can anyone give advice or point me in > the right direction? $ man xfs_quota ..... timer [ -gpu ] [ -bir ] value Grace timers are global in XFS, not per-user or per-group. Dave. -- Dave Chinner david@fromorbit.com From BATV+52e17a1590f5209cb140+2475+infradead.org+hch@bombadil.srs.infradead.org Thu Jun 3 01:50:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o536oQOE140151 for ; Thu, 3 Jun 2010 01:50:28 -0500 X-ASG-Debug-ID: 1275547974-691301610000-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 BB9CE391DD7 for ; Wed, 2 Jun 2010 23:52:54 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id BZ1KeKLHdLOrmcCe for ; Wed, 02 Jun 2010 23:52:54 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OK4IO-0000pS-IC; Thu, 03 Jun 2010 06:52:52 +0000 Date: Thu, 3 Jun 2010 02:52:52 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com, linux-mm@kvack.org X-ASG-Orig-Subj: Re: [PATCH 02/17] xfs: skip writeback from reclaim context Subject: Re: [PATCH 02/17] xfs: skip writeback from reclaim context Message-ID: <20100603065252.GA28592@infradead.org> References: <20100531160727.842750532@bombadil.infradead.org> <20100531160859.184576507@bombadil.infradead.org> <20100602043957.GB7011@dastard> <20100602100812.GA25035@infradead.org> <20100602230209.GA27325@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100602230209.GA27325@dastard> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1275547974 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, Jun 03, 2010 at 09:02:09AM +1000, Dave Chinner wrote: > Did you skip it unconditionally, or only when a transaction was > required? xfs_vm_releasepage is mostly a no-op if no transaction is required. If we have neither delalloc nor unwritten buffer we do not actually enter xfs_page_state_convert, and ->releasepage also doesn't touch unampped buffers at all. > The scary part is that I've seen stack traces (i.e. most stack used) > through this reclaim path for delalloc conversion even for > allocations that are GFP_NOFS and the only thing saving us from > deadlocks is th PF_FSTRANS check. Even worse is that > shrinker_page_list() will call try_to_release_pages() without > checking whether it's allowed to enter the filesystem or not, so we > can be doing block allocation in places we've specifically told the > memory allocation subsystem not to.... s/shrinker_page_list/shrink_page_list/ and s/try_to_release_pages/try_to_release_page/ above. shrink_page_list takes the gfp_mask for try_to_release_page from the scan_control structure passed to it from all the top of the long callchain. I can't find anobvious bug, but this could cause a lot more harm. From aelder@sgi.com Thu Jun 3 11:17:42 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (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 o53GHfTw165289 for ; Thu, 3 Jun 2010 11:17:42 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay1.corp.sgi.com (Postfix) with ESMTP id 733EF8F8094; Thu, 3 Jun 2010 09:20:07 -0700 (PDT) Received: from [128.162.232.162] ([128.162.232.162]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 3 Jun 2010 11:19:27 -0500 Subject: Re: [PATCH] xfs: improve xfs_isilocked From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20100529095019.GA18859@infradead.org> References: <20100527190533.GB16102@infradead.org> <1275075653.2302.38.camel@doink> <20100529095019.GA18859@infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Thu, 03 Jun 2010 11:19:27 -0500 Message-ID: <1275581967.2468.9.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 03 Jun 2010 16:19:27.0952 (UTC) FILETIME=[8A0F9500:01CB0338] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, 2010-05-29 at 05:50 -0400, Christoph Hellwig wrote: > On Fri, May 28, 2010 at 02:40:53PM -0500, Alex Elder wrote: > > On Thu, 2010-05-27 at 15:05 -0400, Christoph Hellwig wrote: > > > Use rwsem_is_locked to make the assertations for shared locks work. > > > > So you're changing it so it answers "yes it's locked" > > even it it's only a read lock now, right? . . . > > Now it's "If the exclusive flag is set, but no writer, > > it's not locked. Otherwise if the shared flag is > > set it's locked if rwsem_is_locked() says we are. > > Otherwise (ASSERT(0) and) it is not locked." > > Not exactly. Now it's: > > - if excl is set but shared isn't return true if mr_writer is > set, else false > - if shared is set either alone or together with excl return > if it is locked in any way (rwsem_is_locked). OK, that makes sense, I get it now. > Note that xfs_isilocked can be called like: > > ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)); > > which means that either excl or shared is fine. > > - if either one or both of excl and shared are set and it's > > > That last part is wrong I think. It should be OK to > > call xfs_isilocked() with neither flag set, in which > > case the result should be 0. > > We can argue about removing the assert, but we currently don't > and should't call xfs_isilocked wit ha 0 argument - it's rather > pointless to do so. Yes, you're right. I'd still say the function should return the right answer even if given an unreasonable request. But that's being pedantic. > > > And if the exclusive > > flag is set, and there *is* a writer, it *is* locked, > > so it should return 1. > > We do that right now. Yup. Thanks for setting me straight. Reviewed-by: Alex Elder From aelder@sgi.com Thu Jun 3 11:59:55 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o53GxthH167045 for ; Thu, 3 Jun 2010 11:59:55 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay1.corp.sgi.com (Postfix) with ESMTP id 328A68F808E; Thu, 3 Jun 2010 10:02:21 -0700 (PDT) Received: from [128.162.232.162] ([128.162.232.162]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 3 Jun 2010 12:01:47 -0500 Subject: Re: [PATCH 00/17] pending patches From: Alex Elder Reply-To: aelder@sgi.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20100531160727.842750532@bombadil.infradead.org> References: <20100531160727.842750532@bombadil.infradead.org> Content-Type: text/plain; charset="UTF-8" Date: Thu, 03 Jun 2010 12:01:46 -0500 Message-ID: <1275584506.2468.57.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 03 Jun 2010 17:01:47.0125 (UTC) FILETIME=[7386A250:01CB033E] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, 2010-05-31 at 12:07 -0400, Christoph Hellwig wrote: > Here's my list of pending patches. Ordering them is getting a bit > difficult as various patches that have been out of a while haven't > been commited yet. Note that some patches require Dave's > > [PATCH] xfs: fix race in inode cluster freeing failing to stale inodes > > applies first. That patch is a clear candidate for something that > should go to Linus ASAP IHMO. I agree it should go into 2.6.35. Last I saw on that one, Dave said he was going to update it, so I was waiting for that. I now see it's available on his kernel.org tree so I can grab that and get it in the pipeline to send to Linus soon. I mentioned to you privately a few weeks ago that I had some concerns about removing DMAPI support, and had promised to send a note out to the list to that effect, but regretfully I never did that. I would like to have a chance to submit an alternative to simply removing that code. I recognize it sits in the first part of your patch series, and I will gladly do the work to rearrange them to put it at the end, in order to give me some time to develop my proposed change. Basically what I'd like to do is update the DMAPI support code so that it is much better isolated. I would like to replace the big ugly hunks that lie in common code paths with small function calls, so that their footprint is minimal and not distracting (along the lines of tracing calls). I got a start on doing this, and had hoped to send the result pretty soon after your initial posting of the patch, but that work unfortunately got preempted by other more pressing stuff. I wanted to provide actual code to help make the discussion of the merits of removal versus cleanup more concrete. I now think I'll be able to put something together within the next week or so. I'll wait to hear back from you and others. In the mean time I'll make my way through the rest of the patch series. -Alex From BATV+52e17a1590f5209cb140+2475+infradead.org+hch@bombadil.srs.infradead.org Thu Jun 3 12:05:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o53H5pFm167340 for ; Thu, 3 Jun 2010 12:05:52 -0500 X-ASG-Debug-ID: 1275584900-0ffd01090000-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 41AD63941D7; Thu, 3 Jun 2010 10:08:20 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id NkEMd0SHa3mWALRi; Thu, 03 Jun 2010 10:08:20 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OKDty-0003JU-WF; Thu, 03 Jun 2010 17:08:19 +0000 Date: Thu, 3 Jun 2010 13:08:18 -0400 From: Christoph Hellwig To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: dropping dmapi support, was Re: [PATCH 00/17] pending patches Subject: dropping dmapi support, was Re: [PATCH 00/17] pending patches Message-ID: <20100603170818.GA18591@infradead.org> References: <20100531160727.842750532@bombadil.infradead.org> <1275584506.2468.57.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1275584506.2468.57.camel@doink> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1275584900 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, Jun 03, 2010 at 12:01:46PM -0500, Alex Elder wrote: > I would like to have a chance to submit an alternative to simply > removing that code. I recognize it sits in the first part of your > patch series, and I will gladly do the work to rearrange them to > put it at the end, in order to give me some time to develop my > proposed change. > > Basically what I'd like to do is update the DMAPI support code > so that it is much better isolated. I would like to replace > the big ugly hunks that lie in common code paths with small > function calls, so that their footprint is minimal and not > distracting (along the lines of tracing calls). > > I got a start on doing this, and had hoped to send the result > pretty soon after your initial posting of the patch, but that > work unfortunately got preempted by other more pressing stuff. > I wanted to provide actual code to help make the discussion > of the merits of removal versus cleanup more concrete. I > now think I'll be able to put something together within the > next week or so. I don't think it's a good idea. I'm happy to not burn all bridges and leave certain code structured in a way that makes adding it easier, but if the hooks are as easy as you say above they can easily live in an out of tree patchset. The general Linux kernel policy is that we don't keep hooks for out of tree code around, and I tend to agree to it. We kept all that dmapi cruft in, and it's never served any purpose for us. I think that HSM support is actually a very useful feature, but the a kernel interface based on the DMAPI specification much less so, and the horrible SGI implementation that used to be in the XFS CVS tree even less so. If you want to push a new one the metadata hooks really need to be entirely outside the low-level filesystem, that is before calling into the namespace inode operations, which is easily doable even while keeping the current DMAPI core. But what's much more difficult is the read/write path. The dmapi code really gets in the way there, and I have additional simplification of this code pending that require this cruft to go away. XFS currently has a needlessly complicated write path, and getting closer to the generic code will help us with lots of things like the upcoming multi page write support. From aelder@sgi.com Thu Jun 3 16:56:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from 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 o53LuCIv180418 for ; Thu, 3 Jun 2010 16:56:13 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id CE76CAC009; Thu, 3 Jun 2010 14:58:38 -0700 (PDT) Received: from [128.162.232.162] ([128.162.232.162]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 3 Jun 2010 16:58:10 -0500 Subject: Re: [PATCH] xfs: remove lazy per-AG initialization From: Alex Elder Reply-To: aelder@sgi.com To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com In-Reply-To: <20100530230915.GA13732@dastard> References: <20100528175108.GA9421@infradead.org> <20100530230915.GA13732@dastard> Content-Type: text/plain; charset="UTF-8" Date: Thu, 03 Jun 2010 16:58:10 -0500 Message-ID: <1275602290.2468.110.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 03 Jun 2010 21:58:10.0989 (UTC) FILETIME=[DB88EDD0:01CB0367] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, 2010-05-31 at 09:09 +1000, Dave Chinner wrote: > On Fri, May 28, 2010 at 01:51:08PM -0400, Christoph Hellwig wrote: > > Historically XFS initializes the allocator / inode allocator per-AG > > lazily, that is the first time this information is required. For > > filesystems that use lazy superblock counters (which is the default now) > > we already have to walk all AGs to initialize the superblock counters > > on an unclean shutdown. > > Which is not common, so isn't frequently triggered in the normal > mount process. The reason for the lazy initialisation is to speed > the mount process up when there are thousands of AGs. That is, we > avoid thousands of serialised IOs in the mount path. Have you > checked to see what the impact is on the clean mount execution time > is on such a filesystem? It's interesting that the time penalty you're talking about doesn't go away, it just becomes less noticeable because it's aggregated over subsequent access to the AG's. I like the cleanup too, but I agree it would be useful to quantify what this particular impact is. -Alex > FWIW, in the case of an unclean shutdown, we are already on the slow path > due to log recovery so adding IO to read all the headers it not such > a big deal as they have probably been read in during replay, anyway. > > > This patch generalizes that code so that we > > always initialize the per-AG data on mount, and also during growfs so > > that we can remove all the special case code in the fastpath which > > couldn't assume that the per-AG data is already initialized. > > I like the cleanup, but I'm not sure that potentially adding tens of > seconds to the time to mount a really large filesystem is a good > tradeoff... > > Cheers, > > Dave. From SRS0+7xkR+3+fromorbit.com=david@internode.on.net Thu Jun 3 17:31:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o53MVXNY181968 for ; Thu, 3 Jun 2010 17:31:34 -0500 X-ASG-Debug-ID: 1275604590-707c022c0000-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 08D61ABF5D1 for ; Thu, 3 Jun 2010 15:36:31 -0700 (PDT) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id RcmfpHunH3EXnxdY for ; Thu, 03 Jun 2010 15:36:31 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26617898-1927428 for multiple; Fri, 04 Jun 2010 08:03:58 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OKIz7-00051S-1L; Fri, 04 Jun 2010 08:33:57 +1000 Date: Fri, 4 Jun 2010 08:33:56 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Alex Elder , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: dropping dmapi support, was Re: [PATCH 00/17] pending patches Subject: Re: dropping dmapi support, was Re: [PATCH 00/17] pending patches Message-ID: <20100603223356.GA14752@dastard> References: <20100531160727.842750532@bombadil.infradead.org> <1275584506.2468.57.camel@doink> <20100603170818.GA18591@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100603170818.GA18591@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1275604593 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31549 Rule breakdown below pts rule 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, Jun 03, 2010 at 01:08:18PM -0400, Christoph Hellwig wrote: > On Thu, Jun 03, 2010 at 12:01:46PM -0500, Alex Elder wrote: > > I would like to have a chance to submit an alternative to simply > > removing that code. I recognize it sits in the first part of your > > patch series, and I will gladly do the work to rearrange them to > > put it at the end, in order to give me some time to develop my > > proposed change. > > > > Basically what I'd like to do is update the DMAPI support code > > so that it is much better isolated. I would like to replace > > the big ugly hunks that lie in common code paths with small > > function calls, so that their footprint is minimal and not > > distracting (along the lines of tracing calls). > > > > I got a start on doing this, and had hoped to send the result > > pretty soon after your initial posting of the patch, but that > > work unfortunately got preempted by other more pressing stuff. > > I wanted to provide actual code to help make the discussion > > of the merits of removal versus cleanup more concrete. I > > now think I'll be able to put something together within the > > next week or so. > > I don't think it's a good idea. I'm happy to not burn all bridges > and leave certain code structured in a way that makes adding it easier, > but if the hooks are as easy as you say above they can easily live in > an out of tree patchset. The general Linux kernel policy is that we > don't keep hooks for out of tree code around, and I tend to agree to > it. We kept all that dmapi cruft in, and it's never served any > purpose for us. I think that HSM support is actually a very useful > feature, but the a kernel interface based on the DMAPI specification > much less so, and the horrible SGI implementation that used to be > in the XFS CVS tree even less so. > > If you want to push a new one the metadata hooks really need to be > entirely outside the low-level filesystem, that is before calling > into the namespace inode operations, which is easily doable even > while keeping the current DMAPI core. Regardless of the implementation cruftiness, I think this a much better approach. The events and checks really aren't XFS specific, and putting them at a higher level cleanly separates the filesystem functionality from the event+blocking functionality of DMAPI. > But what's much more difficult is the read/write path. The dmapi > code really gets in the way there, and I have additional simplification > of this code pending that require this cruft to go away. XFS currently > has a needlessly complicated write path, and getting closer to the > generic code will help us with lots of things like the upcoming multi > page write support. That is true, and also intervening higher up in the IO path for DMAPI would avoid a lot of the locking complexity that XFS has to go through now to be able to block on events in dmapi calls. Further, with ext4 gaining a persitent handle interface, adding DMAPI to the VFS would also enable HSMs to work on more than just XFS... Cheers, Dave. -- Dave Chinner david@fromorbit.com From xfs@tlinx.org Thu Jun 3 18:26:27 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o53NQRqi185201 for ; Thu, 3 Jun 2010 18:26:27 -0500 X-ASG-Debug-ID: 1275607734-2b3003a50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from Ishtar.sc.tlinx.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4CFC2395E57 for ; Thu, 3 Jun 2010 16:28:54 -0700 (PDT) Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id IuJ9T2zEEEBEZxmt for ; Thu, 03 Jun 2010 16:28:54 -0700 (PDT) Received: from [192.168.3.12] (Athenae [192.168.3.12]) by Ishtar.sc.tlinx.org (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o53NSjRm018011; Thu, 3 Jun 2010 16:28:47 -0700 Message-ID: <4C083AAD.80906@tlinx.org> Date: Thu, 03 Jun 2010 16:28:45 -0700 From: "Linda A. Walsh" User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: Christoph Hellwig CC: xfs-oss X-ASG-Orig-Subj: Re: xfsdump -- not enough memory to dump attributes? w/>20G free -- how much does it need? Subject: Re: xfsdump -- not enough memory to dump attributes? w/>20G free -- how much does it need? References: <4BF7D787.4020903@tlinx.org> <20100525164244.GB18666@infradead.org> In-Reply-To: <20100525164244.GB18666@infradead.org> X-Stationery: 0.5.1 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1275607736 X-Barracuda-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.31552 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 FWIF -- upgrading to the latest tool set seems to have caused these messages to "go away"... Christoph Hellwig wrote: > On Sat, May 22, 2010 at 06:09:27AM -0700, Linda A. Walsh wrote: >> I've seen the problem in the dump below and was wondering what could >> possibly cause this -- because >> shows loads of free memory (>20G)... how much memory do non-root >> attributes take to dump? > > The error comes directly from the libhandle listing routine, which > is a straight forward wrapper around the kernel syscall in current > xfsprogs. > > What xfsprogs version are you using? I noticed your xfsdump is > rather old, so making sure you have recent XFS userspace and > possibly also the kernel would help debugging this. > > Also can you check using strace if the ENOMEM comes directly from > the attr_list_by_handle ioctl? > From SRS0+aHkZ+3+fromorbit.com=dave@internode.on.net Thu Jun 3 18:53:27 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o53NrQM9186315 for ; Thu, 3 Jun 2010 18:53:27 -0500 X-ASG-Debug-ID: 1275609504-706903660000-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 DE23310ABFCB for ; Thu, 3 Jun 2010 16:58:24 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id cIoxCvCt1wWzoaav for ; Thu, 03 Jun 2010 16:58:24 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26667832-1927428 for multiple; Fri, 04 Jun 2010 09:25:47 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OKKGH-000569-Di; Fri, 04 Jun 2010 09:55:45 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OKKGF-0003Gn-B1; Fri, 04 Jun 2010 09:55:43 +1000 From: Dave Chinner To: linux-fsdevel@vger.kernel.org Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: [PATCH 2/6] writeback: Add tracing to balance_dirty_pages Subject: [PATCH 2/6] writeback: Add tracing to balance_dirty_pages Date: Fri, 4 Jun 2010 09:55:24 +1000 Message-Id: <1275609328-12514-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1275609328-12514-1-git-send-email-david@fromorbit.com> References: <1275609328-12514-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1275609505 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31553 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Tracing high level background writeback events is good, but it doesn't give the entire picture. Add IO dispatched by foreground throttling to the writeback events. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/fs-writeback.c | 5 ++ include/trace/events/writeback.h | 80 ++++++++++++++++++++++++++++++++++++++ mm/page-writeback.c | 4 ++ 3 files changed, 89 insertions(+), 0 deletions(-) diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index ebfaed8..7cd4585 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -819,7 +819,11 @@ static long wb_writeback(struct bdi_writeback *wb, wbc.more_io = 0; wbc.nr_to_write = MAX_WRITEBACK_PAGES; wbc.pages_skipped = 0; + + trace_wbc_writeback_start(&wbc); writeback_inodes_wb(wb, &wbc); + trace_wbc_writeback_written(&wbc); + args->nr_pages -= MAX_WRITEBACK_PAGES - wbc.nr_to_write; wrote += MAX_WRITEBACK_PAGES - wbc.nr_to_write; @@ -847,6 +851,7 @@ static long wb_writeback(struct bdi_writeback *wb, if (!list_empty(&wb->b_more_io)) { inode = list_entry(wb->b_more_io.prev, struct inode, i_list); + trace_wbc_writeback_wait(&wbc); inode_wait_for_writeback(inode); } spin_unlock(&inode_lock); diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h index df76457..72c1a12 100644 --- a/include/trace/events/writeback.h +++ b/include/trace/events/writeback.h @@ -7,6 +7,9 @@ #include #include +struct wb_writeback_args; +struct bdi_work; + TRACE_EVENT(writeback_queue, TP_PROTO(struct backing_dev_info *bdi, struct wb_writeback_args *args), @@ -165,6 +168,83 @@ TRACE_EVENT(writeback_bdi_register, TP_printk("%s: %s", __entry->name, __entry->start ? "registered" : "unregistered") ); + +/* pass flags explicitly */ +DECLARE_EVENT_CLASS(wbc_class, + TP_PROTO(struct writeback_control *wbc), + TP_ARGS(wbc), + TP_STRUCT__entry( + __field(unsigned int, wbc) + __array(char, name, 16) + __field(long, nr_to_write) + __field(long, pages_skipped) + __field(int, sb) + __field(int, sync_mode) + __field(int, nonblocking) + __field(int, encountered_congestion) + __field(int, for_kupdate) + __field(int, for_background) + __field(int, for_reclaim) + __field(int, range_cyclic) + __field(int, more_io) + __field(unsigned long, older_than_this) + __field(long, range_start) + __field(long, range_end) + ), + + TP_fast_assign( + char *__name = "(none)"; + + __entry->wbc = (unsigned long)wbc & 0xffff; + if (wbc->bdi) + strncpy(__entry->name, dev_name(wbc->bdi->dev), 16); + else + strncpy(__entry->name, __name, 16); + __entry->nr_to_write = wbc->nr_to_write; + __entry->pages_skipped = wbc->pages_skipped; + __entry->sb = !!wbc->sb; + __entry->sync_mode = wbc->sync_mode; + __entry->for_kupdate = wbc->for_kupdate; + __entry->for_background = wbc->for_background; + __entry->for_reclaim = wbc->for_reclaim; + __entry->range_cyclic = wbc->range_cyclic; + __entry->more_io = wbc->more_io; + __entry->older_than_this = wbc->older_than_this ? + *wbc->older_than_this : 0; + __entry->range_start = (long)wbc->range_start; + __entry->range_end = (long)wbc->range_end; + ), + + TP_printk("dev %s wbc=%x towrt=%ld skip=%ld sb=%d mode=%d kupd=%d " + "bgrd=%d reclm=%d cyclic=%d more=%d older=0x%lx " + "start=0x%lx end=0x%lx", + __entry->name, + __entry->wbc, + __entry->nr_to_write, + __entry->pages_skipped, + __entry->sb, + __entry->sync_mode, + __entry->for_kupdate, + __entry->for_background, + __entry->for_reclaim, + __entry->range_cyclic, + __entry->more_io, + __entry->older_than_this, + __entry->range_start, + __entry->range_end) +) + +#define DEFINE_WBC_EVENT(name) \ +DEFINE_EVENT(wbc_class, name, \ + TP_PROTO(struct writeback_control *wbc), \ + TP_ARGS(wbc)) +DEFINE_WBC_EVENT(wbc_writeback_start); +DEFINE_WBC_EVENT(wbc_writeback_written); +DEFINE_WBC_EVENT(wbc_writeback_wait); +DEFINE_WBC_EVENT(wbc_balance_dirty_start); +DEFINE_WBC_EVENT(wbc_balance_dirty_written); +DEFINE_WBC_EVENT(wbc_balance_dirty_wait); + #endif /* _TRACE_WRITEBACK_H */ /* This part must be outside protection */ diff --git a/mm/page-writeback.c b/mm/page-writeback.c index b289310..68eb727 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -34,6 +34,7 @@ #include #include #include +#include /* * After a CPU has dirtied this many pages, balance_dirty_pages_ratelimited @@ -536,11 +537,13 @@ static void balance_dirty_pages(struct address_space *mapping, * threshold otherwise wait until the disk writes catch * up. */ + trace_wbc_balance_dirty_start(&wbc); if (bdi_nr_reclaimable > bdi_thresh) { writeback_inodes_wbc(&wbc); pages_written += write_chunk - wbc.nr_to_write; get_dirty_limits(&background_thresh, &dirty_thresh, &bdi_thresh, bdi); + trace_wbc_balance_dirty_written(&wbc); } /* @@ -566,6 +569,7 @@ static void balance_dirty_pages(struct address_space *mapping, if (pages_written >= write_chunk) break; /* We've done our duty */ + trace_wbc_balance_dirty_wait(&wbc); __set_current_state(TASK_INTERRUPTIBLE); io_schedule_timeout(pause); -- 1.7.1 From SRS0+YyHg+3+fromorbit.com=dave@internode.on.net Thu Jun 3 18:53:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o53NrYjb186331 for ; Thu, 3 Jun 2010 18:53:35 -0500 X-ASG-Debug-ID: 1275609361-4946035e0000-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 9517F384B58 for ; Thu, 3 Jun 2010 16:56:02 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id W2gmMYlwieGEXSaO for ; Thu, 03 Jun 2010 16:56:02 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26707899-1927428 for multiple; Fri, 04 Jun 2010 09:25:56 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OKKGR-00056A-F0; Fri, 04 Jun 2010 09:55:55 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OKKGF-0003Gp-E1; Fri, 04 Jun 2010 09:55:43 +1000 From: Dave Chinner To: linux-fsdevel@vger.kernel.org Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: [PATCH 3/6] writeback: Add tracing to write_cache_pages Subject: [PATCH 3/6] writeback: Add tracing to write_cache_pages Date: Fri, 4 Jun 2010 09:55:25 +1000 Message-Id: <1275609328-12514-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1275609328-12514-1-git-send-email-david@fromorbit.com> References: <1275609328-12514-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1275609363 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31554 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Add a trace event to the ->writepage loop in write_cache_pages to give visibility into how the ->writepage call is changing variables within the writeback control structure. Of most interest is how wbc->nr_to_write changes from call to call, especially with filesystems that write multiple pages in ->writepage. Signed-off-by: Dave Chinner --- include/trace/events/writeback.h | 1 + mm/page-writeback.c | 1 + 2 files changed, 2 insertions(+), 0 deletions(-) diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h index 72c1a12..5dda40e 100644 --- a/include/trace/events/writeback.h +++ b/include/trace/events/writeback.h @@ -244,6 +244,7 @@ DEFINE_WBC_EVENT(wbc_writeback_wait); DEFINE_WBC_EVENT(wbc_balance_dirty_start); DEFINE_WBC_EVENT(wbc_balance_dirty_written); DEFINE_WBC_EVENT(wbc_balance_dirty_wait); +DEFINE_WBC_EVENT(wbc_writepage); #endif /* _TRACE_WRITEBACK_H */ diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 68eb727..caaf954 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -921,6 +921,7 @@ continue_unlock: if (!clear_page_dirty_for_io(page)) goto continue_unlock; + trace_wbc_writepage(wbc); ret = (*writepage)(page, wbc, data); if (unlikely(ret)) { if (ret == AOP_WRITEPAGE_ACTIVATE) { -- 1.7.1 From SRS0+/7kT+3+fromorbit.com=dave@internode.on.net Thu Jun 3 18:53:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o53NrZjQ186334 for ; Thu, 3 Jun 2010 18:53:35 -0500 X-ASG-Debug-ID: 1275609362-4983037b0000-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 406F3384B58 for ; Thu, 3 Jun 2010 16:56:03 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id tokZV4zzOZPFxBtj for ; Thu, 03 Jun 2010 16:56:03 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26525820-1927428 for multiple; Fri, 04 Jun 2010 09:25:57 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OKKGR-00056O-Lp; Fri, 04 Jun 2010 09:55:55 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OKKGP-0003Gz-KL; Fri, 04 Jun 2010 09:55:53 +1000 From: Dave Chinner To: linux-fsdevel@vger.kernel.org Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: [PATCH 6/6] writeback: limit write_cache_pages integrity scanning to current EOF Subject: [PATCH 6/6] writeback: limit write_cache_pages integrity scanning to current EOF Date: Fri, 4 Jun 2010 09:55:28 +1000 Message-Id: <1275609328-12514-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1275609328-12514-1-git-send-email-david@fromorbit.com> References: <1275609328-12514-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1275609364 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31554 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner sync can currently take a really long time if a concurrent writer is extending a file. The problem is that the dirty pages on the address space grow in the same direction as write_cache_pages scans, so if the writer keeps ahead of writeback, the writeback will not terminate until the writer stops adding dirty pages. For a data integrity sync, we only need to write the pages dirty at the time we start the writeback, so we can stop scanning once we get to the page that was at the end of the file at the time the scan started. This will prevent operations like copying a large file preventing sync from completing as it will not write back pages that were dirtied after the sync was started. This does not impact the existing integrity guarantees, as any dirty page (old or new) within the EOF range at the start of the scan will still be captured. This patch will not prevent sync from blocking on large writes into holes. That requires more complex intervention while this patch only addresses the common append-case of this sync holdoff. Signed-off-by: Dave Chinner --- mm/page-writeback.c | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-) diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 0fe713d..c97e973 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -855,7 +855,22 @@ int write_cache_pages(struct address_space *mapping, if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) range_whole = 1; cycled = 1; /* ignore range_cyclic tests */ + + /* + * If this is a data integrity sync, cap the writeback to the + * current end of file. Any extension to the file that occurs + * after this is a new write and we don't need to write those + * pages out to fulfil our data integrity requirements. If we + * try to write them out, we can get stuck in this scan until + * the concurrent writer stops adding dirty pages and extending + * EOF. + */ + if (wbc->sync_mode == WB_SYNC_ALL && + wbc->range_end == LLONG_MAX) { + end = i_size_read(mapping->host) >> PAGE_CACHE_SHIFT; + } } + retry: done_index = index; while (!done && (index <= end)) { -- 1.7.1 From SRS0+aHkZ+3+fromorbit.com=dave@internode.on.net Thu Jun 3 18:53:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_44, J_CHICKENPOX_45,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o53NrZFb186333 for ; Thu, 3 Jun 2010 18:53:35 -0500 X-ASG-Debug-ID: 1275609512-7085035c0000-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 BE09610ABFD1 for ; Thu, 3 Jun 2010 16:58:33 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id BA4PllNi17mxUEL4 for ; Thu, 03 Jun 2010 16:58:33 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 15090836-1927428 for multiple; Fri, 04 Jun 2010 09:25:56 +0930 (CST) Received: from [192.168.1.9] (helo=disturbed) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OKKGR-000567-8a; Fri, 04 Jun 2010 09:55:55 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OKKGF-0003Gl-8W; Fri, 04 Jun 2010 09:55:43 +1000 From: Dave Chinner To: linux-fsdevel@vger.kernel.org Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: [PATCH 1/6] writeback: initial tracing support Subject: [PATCH 1/6] writeback: initial tracing support Date: Fri, 4 Jun 2010 09:55:23 +1000 Message-Id: <1275609328-12514-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1275609328-12514-1-git-send-email-david@fromorbit.com> References: <1275609328-12514-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1275609514 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31553 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: From: Jens Axboe Trace queue/sched/exec parts of the writeback loop. This provides insight into when and why flusher threads are scheduled to run. e.g a sync invocation leaves a trace like: sync-2798 [006] 611323.335713: writeback_queue: 253:16: pages=87879, sb=0, kupdate=0, range_cyclic=0 for_background=0 sync-2798 [006] 611323.335718: writeback_sched: work=37c0, task=task sync-2798 [006] 611323.335817: writeback_queue: 8:0: pages=92680, sb=1, kupdate=0, range_cyclic=-1 for_background=0 sync-2798 [006] 611323.335819: writeback_sched: work=35c0, task=task sync-2798 [006] 611323.335855: writeback_queue: 253:16: pages=92680, sb=1, kupdate=0, range_cyclic=-1 for_background=0 sync-2798 [006] 611323.335857: writeback_sched: work=36c0, task=task sync-2798 [006] 611323.335890: writeback_queue: 8:0: pages=9223372036854775807, sb=1, kupdate=0, range_cyclic=0 for_background=0 sync-2798 [006] 611323.335891: writeback_sched: work=fe58, task=task sync-2798 [006] 611323.377341: writeback_queue: 253:16: pages=9223372036854775807, sb=1, kupdate=0, range_cyclic=0 for_background=0 sync-2798 [006] 611323.377346: writeback_sched: work=fe58, task=task This also lays the foundation for adding more writeback tracing to provide deeper insight into the whole writeback path. Signed-off-by: Jens Axboe Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/fs-writeback.c | 45 ++++++++-- include/trace/events/writeback.h | 171 ++++++++++++++++++++++++++++++++++++++ mm/backing-dev.c | 3 + 3 files changed, 209 insertions(+), 10 deletions(-) create mode 100644 include/trace/events/writeback.h diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index ea8592b..ebfaed8 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -26,15 +26,9 @@ #include #include #include +#include #include "internal.h" -#define inode_to_bdi(inode) ((inode)->i_mapping->backing_dev_info) - -/* - * We don't actually have pdflush, but this one is exported though /proc... - */ -int nr_pdflush_threads; - /* * Passed into wb_writeback(), essentially a subset of writeback_control */ @@ -63,6 +57,21 @@ struct bdi_work { unsigned long state; /* flag bits, see WS_* */ }; +/* + * Include the creation of the trace points after defining the bdi_work and + * wb_writeback_args structures so that the definitions remain local to this + * file. + */ +#define CREATE_TRACE_POINTS +#include + +#define inode_to_bdi(inode) ((inode)->i_mapping->backing_dev_info) + +/* + * We don't actually have pdflush, but this one is exported though /proc... + */ +int nr_pdflush_threads; + enum { WS_USED_B = 0, WS_ONSTACK_B, @@ -137,6 +146,8 @@ static void wb_work_complete(struct bdi_work *work) static void wb_clear_pending(struct bdi_writeback *wb, struct bdi_work *work) { + trace_writeback_clear(work); + /* * The caller has retrieved the work arguments from this work, * drop our reference. If this is the last ref, delete and free it @@ -172,12 +183,16 @@ static void bdi_queue_work(struct backing_dev_info *bdi, struct bdi_work *work) * If the default thread isn't there, make sure we add it. When * it gets created and wakes up, we'll run this work. */ - if (unlikely(list_empty_careful(&bdi->wb_list))) + if (unlikely(list_empty_careful(&bdi->wb_list))) { + trace_writeback_sched(bdi, work, "default"); wake_up_process(default_backing_dev_info.wb.task); - else { + } else { struct bdi_writeback *wb = &bdi->wb; + struct task_struct *task = wb->task; - if (wb->task) + trace_writeback_sched(bdi, work, task ? "task" : "notask"); + + if (task) wake_up_process(wb->task); } } @@ -205,6 +220,7 @@ static void bdi_alloc_queue_work(struct backing_dev_info *bdi, work = kmalloc(sizeof(*work), GFP_ATOMIC); if (work) { bdi_work_init(work, args); + trace_writeback_queue(bdi, args); bdi_queue_work(bdi, work); if (wait) bdi_wait_on_work_clear(work); @@ -245,6 +261,7 @@ static void bdi_sync_writeback(struct backing_dev_info *bdi, bdi_work_init(&work, &args); work.state |= WS_ONSTACK; + trace_writeback_queue(bdi, &args); bdi_queue_work(bdi, &work); bdi_wait_on_work_clear(&work); } @@ -914,6 +931,8 @@ long wb_do_writeback(struct bdi_writeback *wb, int force_wait) struct wb_writeback_args args = work->args; int post_clear; + trace_writeback_exec(work); + /* * Override sync mode, in case we must wait for completion */ @@ -957,9 +976,13 @@ int bdi_writeback_task(struct bdi_writeback *wb) unsigned long wait_jiffies = -1UL; long pages_written; + trace_writeback_thread_start(1); + while (!kthread_should_stop()) { pages_written = wb_do_writeback(wb, 0); + trace_writeback_pages_written(pages_written); + if (pages_written) last_active = jiffies; else if (wait_jiffies != -1UL) { @@ -989,6 +1012,8 @@ int bdi_writeback_task(struct bdi_writeback *wb) try_to_freeze(); } + trace_writeback_thread_start(0); + return 0; } diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h new file mode 100644 index 0000000..df76457 --- /dev/null +++ b/include/trace/events/writeback.h @@ -0,0 +1,171 @@ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM writeback + +#if !defined(_TRACE_WRITEBACK_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_WRITEBACK_H + +#include +#include + +TRACE_EVENT(writeback_queue, + + TP_PROTO(struct backing_dev_info *bdi, struct wb_writeback_args *args), + + TP_ARGS(bdi, args), + + TP_STRUCT__entry( + __array(char, name, 16) + __field(long, nr_pages) + __field(int, sb) + __field(int, sync_mode) + __field(int, for_kupdate) + __field(int, range_cyclic) + __field(int, for_background) + ), + + TP_fast_assign( + strncpy(__entry->name, dev_name(bdi->dev), 16); + __entry->nr_pages = args->nr_pages; + __entry->sb = !!args->sb; + __entry->for_kupdate = args->for_kupdate; + __entry->range_cyclic = args->range_cyclic; + __entry->for_background = args->for_background; + ), + + TP_printk("%s: pages=%ld, sb=%d, kupdate=%d, range_cyclic=%d " + "for_background=%d", __entry->name, __entry->nr_pages, + __entry->sb, __entry->for_kupdate, + __entry->range_cyclic, __entry->for_background) +); + +TRACE_EVENT(writeback_sched, + + TP_PROTO(struct backing_dev_info *bdi, struct bdi_work *work, + const char *msg), + + TP_ARGS(bdi, work, msg), + + TP_STRUCT__entry( + __array(char, name, 16) + __field(unsigned int, work) + __array(char, task, 8) + ), + + TP_fast_assign( + strncpy(__entry->name, dev_name(bdi->dev), 16); + __entry->work = (unsigned long) work & 0xffff; + snprintf(__entry->task, 8, "%s", msg); + ), + + TP_printk("work=%x, task=%s", __entry->work, __entry->task) +); + +TRACE_EVENT(writeback_exec, + + TP_PROTO(struct bdi_work *work), + + TP_ARGS(work), + + TP_STRUCT__entry( + __field(unsigned int, work) + __field(long, nr_pages) + __field(int, sb) + __field(int, sync_mode) + __field(int, for_kupdate) + __field(int, range_cyclic) + __field(int, for_background) + ), + + TP_fast_assign( + __entry->work = (unsigned long) work & 0xffff; + __entry->nr_pages = work->args.nr_pages; + __entry->sb = !!work->args.sb; + __entry->for_kupdate = work->args.for_kupdate; + __entry->range_cyclic = work->args.range_cyclic; + __entry->for_background = work->args.for_background; + + ), + + TP_printk("work=%x pages=%ld, sb=%d, kupdate=%d, range_cyclic=%d" + " for_background=%d", __entry->work, + __entry->nr_pages, __entry->sb, __entry->for_kupdate, + __entry->range_cyclic, __entry->for_background) +); + +TRACE_EVENT(writeback_clear, + + TP_PROTO(struct bdi_work *work), + + TP_ARGS(work), + + TP_STRUCT__entry( + __field(struct bdi_work *, work) + __field(int, refs) + ), + + TP_fast_assign( + __entry->work = work; + __entry->refs = atomic_read(&work->pending); + ), + + TP_printk("work=%p, refs=%d", __entry->work, __entry->refs) +); + +TRACE_EVENT(writeback_pages_written, + + TP_PROTO(long pages_written), + + TP_ARGS(pages_written), + + TP_STRUCT__entry( + __field(long, pages) + ), + + TP_fast_assign( + __entry->pages = pages_written; + ), + + TP_printk("%ld", __entry->pages) +); + + +TRACE_EVENT(writeback_thread_start, + + TP_PROTO(int start), + + TP_ARGS(start), + + TP_STRUCT__entry( + __field(int, start) + ), + + TP_fast_assign( + __entry->start = start; + ), + + TP_printk("%s", __entry->start ? "started" : "exited") +); + +TRACE_EVENT(writeback_bdi_register, + + TP_PROTO(const char *name, int start), + + TP_ARGS(name, start), + + TP_STRUCT__entry( + __array(char, name, 16) + __field(int, start) + ), + + TP_fast_assign( + strncpy(__entry->name, name, 16); + __entry->start = start; + ), + + TP_printk("%s: %s", __entry->name, + __entry->start ? "registered" : "unregistered") +); +#endif /* _TRACE_WRITEBACK_H */ + +/* This part must be outside protection */ +#include diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 660a87a..1f7723b 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -10,6 +10,7 @@ #include #include #include +#include static atomic_long_t bdi_seq = ATOMIC_LONG_INIT(0); @@ -585,6 +586,7 @@ int bdi_register(struct backing_dev_info *bdi, struct device *parent, bdi_debug_register(bdi, dev_name(dev)); set_bit(BDI_registered, &bdi->state); + trace_writeback_bdi_register(dev_name(dev), 1); exit: return ret; } @@ -647,6 +649,7 @@ static void bdi_prune_sb(struct backing_dev_info *bdi) void bdi_unregister(struct backing_dev_info *bdi) { if (bdi->dev) { + trace_writeback_bdi_register(dev_name(bdi->dev), 0); bdi_prune_sb(bdi); if (!bdi_cap_flush_forker(bdi)) -- 1.7.1 From SRS0+aHkZ+3+fromorbit.com=dave@internode.on.net Thu Jun 3 18:53:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_ATTENTION autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o53NrjSB186382 for ; Thu, 3 Jun 2010 18:53:45 -0500 X-ASG-Debug-ID: 1275609523-706403320000-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 D22B210ABFE1 for ; Thu, 3 Jun 2010 16:58:43 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id PbUVsNkkkt6NjChc for ; Thu, 03 Jun 2010 16:58:43 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26667863-1927428 for multiple; Fri, 04 Jun 2010 09:26:07 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OKKGR-00056J-Ip; Fri, 04 Jun 2010 09:55:55 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OKKGF-0003Gs-G8; Fri, 04 Jun 2010 09:55:43 +1000 From: Dave Chinner To: linux-fsdevel@vger.kernel.org Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: [PATCH 4/6] writeback: pay attention to wbc->nr_to_write in write_cache_pages Subject: [PATCH 4/6] writeback: pay attention to wbc->nr_to_write in write_cache_pages Date: Fri, 4 Jun 2010 09:55:26 +1000 Message-Id: <1275609328-12514-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1275609328-12514-1-git-send-email-david@fromorbit.com> References: <1275609328-12514-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1275609524 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31553 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner If a filesystem writes more than one page in ->writepage, write_cache_pages fails to notice this and continues to attempt writeback when wbc->nr_to_write has gone negative - this trace was captured from XFS: wbc_writeback_start: towrt=1024 wbc_writepage: towrt=1024 wbc_writepage: towrt=0 wbc_writepage: towrt=-1 wbc_writepage: towrt=-5 wbc_writepage: towrt=-21 wbc_writepage: towrt=-85 This has adverse effects on filesystem writeback behaviour. write_cache_pages() needs to terminate after a certain number of pages are written, not after a certain number of calls to ->writepage are made. This is a regression introduced by 17bc6c30cf6bfffd816bdc53682dd46fc34a2cf4 ("vfs: Add no_nrwrite_index_update writeback control flag"), but cannot be reverted directly due to subsequent bug fixes that have gone in on top of it. This commit adds a ->writepage tracepoint inside write_cache_pages() (how the above trace was generated) and does the revert manually leaving the subsequent bug fixes intact. ext4 is not affected by this as a previous commit in the series stops ext4 from using the generic function. Signed-off-by: Dave Chinner --- include/linux/writeback.h | 9 --------- include/trace/events/ext4.h | 5 +---- mm/page-writeback.c | 15 +++++---------- 3 files changed, 6 insertions(+), 23 deletions(-) diff --git a/include/linux/writeback.h b/include/linux/writeback.h index cc97d6c..52e82f3 100644 --- a/include/linux/writeback.h +++ b/include/linux/writeback.h @@ -56,15 +56,6 @@ struct writeback_control { unsigned for_reclaim:1; /* Invoked from the page allocator */ unsigned range_cyclic:1; /* range_start is cyclic */ unsigned more_io:1; /* more io to be dispatched */ - /* - * write_cache_pages() won't update wbc->nr_to_write and - * mapping->writeback_index if no_nrwrite_index_update - * is set. write_cache_pages() may write more than we - * requested and we want to make sure nr_to_write and - * writeback_index are updated in a consistent manner - * so we use a single control to update them - */ - unsigned no_nrwrite_index_update:1; /* * For WB_SYNC_ALL, the sb must always be pinned. For WB_SYNC_NONE, diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index f5b1ba9..f3865c7 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h @@ -306,7 +306,6 @@ TRACE_EVENT(ext4_da_writepages_result, __field( int, pages_written ) __field( long, pages_skipped ) __field( char, more_io ) - __field( char, no_nrwrite_index_update ) __field( pgoff_t, writeback_index ) ), @@ -317,16 +316,14 @@ TRACE_EVENT(ext4_da_writepages_result, __entry->pages_written = pages_written; __entry->pages_skipped = wbc->pages_skipped; __entry->more_io = wbc->more_io; - __entry->no_nrwrite_index_update = wbc->no_nrwrite_index_update; __entry->writeback_index = inode->i_mapping->writeback_index; ), - TP_printk("dev %s ino %lu ret %d pages_written %d pages_skipped %ld more_io %d no_nrwrite_index_update %d writeback_index %lu", + TP_printk("dev %s ino %lu ret %d pages_written %d pages_skipped %ld more_io %d writeback_index %lu", jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, __entry->ret, __entry->pages_written, __entry->pages_skipped, __entry->more_io, - __entry->no_nrwrite_index_update, (unsigned long) __entry->writeback_index) ); diff --git a/mm/page-writeback.c b/mm/page-writeback.c index caaf954..0fe713d 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -839,7 +839,6 @@ int write_cache_pages(struct address_space *mapping, pgoff_t done_index; int cycled; int range_whole = 0; - long nr_to_write = wbc->nr_to_write; pagevec_init(&pvec, 0); if (wbc->range_cyclic) { @@ -940,11 +939,10 @@ continue_unlock: done = 1; break; } - } + } - if (nr_to_write > 0) { - nr_to_write--; - if (nr_to_write == 0 && + if (wbc->nr_to_write > 0) { + if (--wbc->nr_to_write == 0 && wbc->sync_mode == WB_SYNC_NONE) { /* * We stop writing back only if we are @@ -975,11 +973,8 @@ continue_unlock: end = writeback_index - 1; goto retry; } - if (!wbc->no_nrwrite_index_update) { - if (wbc->range_cyclic || (range_whole && nr_to_write > 0)) - mapping->writeback_index = done_index; - wbc->nr_to_write = nr_to_write; - } + if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0)) + mapping->writeback_index = done_index; return ret; } -- 1.7.1 From SRS0+aHkZ+3+fromorbit.com=dave@internode.on.net Thu Jun 3 18:53:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_21 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o53NrsY3186403 for ; Thu, 3 Jun 2010 18:53:54 -0500 X-ASG-Debug-ID: 1275609361-4988037a0000-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 538B3384B55 for ; Thu, 3 Jun 2010 16:56:02 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id FlBR1k03vSnwEcyz for ; Thu, 03 Jun 2010 16:56:02 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26976017-1927428 for multiple; Fri, 04 Jun 2010 09:25:56 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OKKGH-000566-98; Fri, 04 Jun 2010 09:55:45 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OKKGF-0003Gj-6Y; Fri, 04 Jun 2010 09:55:43 +1000 From: Dave Chinner To: linux-fsdevel@vger.kernel.org Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: [PATCH 0/6] writeback: tracing and fixes V3. Subject: [PATCH 0/6] writeback: tracing and fixes V3. Date: Fri, 4 Jun 2010 09:55:22 +1000 Message-Id: <1275609328-12514-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1275609363 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31554 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This series contains the initial writeback tracing patches from Jens, as well as the extensions I added to provide visibility into writeback control structures as the are used by the writeback code. The visibility given is sufficient to understand what is happening in the writeback path - what path is writing data, what path is blocking on congestion, etc, and to determine the differences in behaviour for different sync modes and calling contexts. This tracing really needs to be integrated into mainline so that anyone can improve the tracing as they use it to track down problems in our convoluted writeback paths. The remaining patches are fixes to problems that the new tracing highlighted. Version 3: - added comment to tracepoint creation to explain the unusual placement of the tracepoint header file include. - separated out ->writepage tracepoint addition into it's own patch. - dropped ext4 write_cache_pages separation as it is now in mainline. - removed ext4 tracing references to wbc->no_nrwrite_index_update as they weren't removed in the write_cache_pages patch in mainline. - fixed commit message for write_cache_pages patch - added more information to commit message for sync hold-off fixup. Version 2: - included ext4 write_cache_pages separation patch from Ted Ts'o. - moved CREATE_TRACE_POINTS into fs-writeback.c as suggested by Christoph Hellwig. - moved include of trace/events/writeback.h until after structure definitions in fs-writeback.c - manually revert changes made to write_cache_pages() in 17bc6c30cf6bfffd816bdc53682dd46fc34a2cf4 that caused the regression. This restores the convention that if the fs writes back more than a single page, it subtracts (nr_written - 1) from wbc->nr_to_write, as suggested by Andrew Morton. - added patch to prevent sync from looping in write_cache_pages chasing a moving tail when an appending write workload is running concurrently with sync. From SRS0+fJ0p+3+fromorbit.com=dave@internode.on.net Thu Jun 3 18:58:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o53NwZGF186604 for ; Thu, 3 Jun 2010 18:58:36 -0500 X-ASG-Debug-ID: 1275609362-493e03730000-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 99C29384B5B for ; Thu, 3 Jun 2010 16:56:03 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id SHjnJq78yvIrsh8D for ; Thu, 03 Jun 2010 16:56:03 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26833812-1927428 for multiple; Fri, 04 Jun 2010 09:25:57 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OKKGR-00056K-J5; Fri, 04 Jun 2010 09:55:55 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OKKGP-0003Gv-Ie; Fri, 04 Jun 2010 09:55:53 +1000 From: Dave Chinner To: linux-fsdevel@vger.kernel.org Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: [PATCH 5/6] xfs: remove nr_to_write writeback windup. Subject: [PATCH 5/6] xfs: remove nr_to_write writeback windup. Date: Fri, 4 Jun 2010 09:55:27 +1000 Message-Id: <1275609328-12514-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1275609328-12514-1-git-send-email-david@fromorbit.com> References: <1275609328-12514-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1275609364 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31554 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Now that the background flush code has been fixed, we shouldn't need to silently multiply the wbc->nr_to_write to get good writeback. Remove that code. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_aops.c | 8 -------- 1 files changed, 0 insertions(+), 8 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index 089eaca..4c89db3 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c @@ -1366,14 +1366,6 @@ xfs_vm_writepage( if (!page_has_buffers(page)) create_empty_buffers(page, 1 << inode->i_blkbits, 0); - - /* - * VM calculation for nr_to_write seems off. Bump it way - * up, this gets simple streaming writes zippy again. - * To be reviewed again after Jens' writeback changes. - */ - wbc->nr_to_write *= 4; - /* * Convert delayed allocate, unwritten or unmapped space * to real space and flush out to disk. -- 1.7.1 From lizf@cn.fujitsu.com Thu Jun 3 20:05:39 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5415dCj189984 for ; Thu, 3 Jun 2010 20:05:39 -0500 X-ASG-Debug-ID: 1275613684-26a5006a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from song.cn.fujitsu.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1F6C63934C6 for ; Thu, 3 Jun 2010 18:08:05 -0700 (PDT) Received: from song.cn.fujitsu.com (cn.fujitsu.com [222.73.24.84]) by cuda.sgi.com with ESMTP id s0m2Xpb3foFjnJMY for ; Thu, 03 Jun 2010 18:08:05 -0700 (PDT) Received: from tang.cn.fujitsu.com (tang.cn.fujitsu.com [10.167.250.3]) by song.cn.fujitsu.com (Postfix) with ESMTP id 66BB6170138; Fri, 4 Jun 2010 09:08:03 +0800 (CST) Received: from fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id o5415n4q001800; Fri, 4 Jun 2010 09:05:49 +0800 Received: from lizf.localdomain (unknown [10.167.141.140]) by fnst.cn.fujitsu.com (Postfix) with ESMTPA id C682F10C10D; Fri, 4 Jun 2010 09:11:56 +0800 (CST) Message-ID: <4C085289.9040000@cn.fujitsu.com> Date: Fri, 04 Jun 2010 09:10:33 +0800 From: Li Zefan User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1b3pre) Gecko/20090513 Fedora/3.0-2.3.beta2.fc11 Thunderbird/3.0b2 MIME-Version: 1.0 To: Dave Chinner CC: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: Re: [PATCH 1/6] writeback: initial tracing support Subject: Re: [PATCH 1/6] writeback: initial tracing support References: <1275609328-12514-1-git-send-email-david@fromorbit.com> <1275609328-12514-2-git-send-email-david@fromorbit.com> In-Reply-To: <1275609328-12514-2-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cn.fujitsu.com[222.73.24.84] X-Barracuda-Start-Time: 1275613688 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31558 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean > +TRACE_EVENT(writeback_queue, > + > + TP_PROTO(struct backing_dev_info *bdi, struct wb_writeback_args *args), > + > + TP_ARGS(bdi, args), > + > + TP_STRUCT__entry( > + __array(char, name, 16) > + __field(long, nr_pages) > + __field(int, sb) > + __field(int, sync_mode) > + __field(int, for_kupdate) > + __field(int, range_cyclic) > + __field(int, for_background) > + ), > + > + TP_fast_assign( > + strncpy(__entry->name, dev_name(bdi->dev), 16); Should use strlcpy() ? > + __entry->nr_pages = args->nr_pages; > + __entry->sb = !!args->sb; > + __entry->for_kupdate = args->for_kupdate; > + __entry->range_cyclic = args->range_cyclic; > + __entry->for_background = args->for_background; > + ), > + > + TP_printk("%s: pages=%ld, sb=%d, kupdate=%d, range_cyclic=%d " > + "for_background=%d", __entry->name, __entry->nr_pages, > + __entry->sb, __entry->for_kupdate, > + __entry->range_cyclic, __entry->for_background) > +); > + > +TRACE_EVENT(writeback_sched, > + > + TP_PROTO(struct backing_dev_info *bdi, struct bdi_work *work, > + const char *msg), > + > + TP_ARGS(bdi, work, msg), > + > + TP_STRUCT__entry( > + __array(char, name, 16) > + __field(unsigned int, work) > + __array(char, task, 8) > + ), > + > + TP_fast_assign( > + strncpy(__entry->name, dev_name(bdi->dev), 16); ditto > + __entry->work = (unsigned long) work & 0xffff; > + snprintf(__entry->task, 8, "%s", msg); > + ), > + > + TP_printk("work=%x, task=%s", __entry->work, __entry->task) > +); ... > +TRACE_EVENT(writeback_bdi_register, > + > + TP_PROTO(const char *name, int start), > + > + TP_ARGS(name, start), > + > + TP_STRUCT__entry( > + __array(char, name, 16) > + __field(int, start) > + ), > + > + TP_fast_assign( > + strncpy(__entry->name, name, 16); ditto > + __entry->start = start; > + ), > + > + TP_printk("%s: %s", __entry->name, > + __entry->start ? "registered" : "unregistered") > +); From SRS0+eH4A+4+fromorbit.com=david@internode.on.net Thu Jun 3 20:22:04 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_44, J_CHICKENPOX_45,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o541M3f4190800 for ; Thu, 3 Jun 2010 20:22:04 -0500 X-ASG-Debug-ID: 1275614670-268700b70000-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 F09513960F4 for ; Thu, 3 Jun 2010 18:24:30 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id e38iCeflcmyTLjIt for ; Thu, 03 Jun 2010 18:24:30 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26679896-1927428 for multiple; Fri, 04 Jun 2010 10:54:28 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OKLdw-0005Cz-QH; Fri, 04 Jun 2010 11:24:16 +1000 Date: Fri, 4 Jun 2010 11:24:16 +1000 From: Dave Chinner To: Li Zefan Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: Re: [PATCH 1/6] writeback: initial tracing support Subject: Re: [PATCH 1/6] writeback: initial tracing support Message-ID: <20100604012416.GB19651@dastard> References: <1275609328-12514-1-git-send-email-david@fromorbit.com> <1275609328-12514-2-git-send-email-david@fromorbit.com> <4C085289.9040000@cn.fujitsu.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C085289.9040000@cn.fujitsu.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1275614671 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31560 Rule breakdown below pts rule 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, Jun 04, 2010 at 09:10:33AM +0800, Li Zefan wrote: > > +TRACE_EVENT(writeback_queue, > > + > > + TP_PROTO(struct backing_dev_info *bdi, struct wb_writeback_args *args), > > + > > + TP_ARGS(bdi, args), > > + > > + TP_STRUCT__entry( > > + __array(char, name, 16) > > + __field(long, nr_pages) > > + __field(int, sb) > > + __field(int, sync_mode) > > + __field(int, for_kupdate) > > + __field(int, range_cyclic) > > + __field(int, for_background) > > + ), > > + > > + TP_fast_assign( > > + strncpy(__entry->name, dev_name(bdi->dev), 16); > > Should use strlcpy() ? Don't care. Updated patch below. Cheers, Dave. -- Dave Chinner david@fromorbit.com writeback: initial tracing support From: Jens Axboe Trace queue/sched/exec parts of the writeback loop. This provides insight into when and why flusher threads are scheduled to run. e.g a sync invocation leaves a trace like: sync-2798 [006] 611323.335713: writeback_queue: 253:16: pages=87879, sb=0, kupdate=0, range_cyclic=0 for_background=0 sync-2798 [006] 611323.335718: writeback_sched: work=37c0, task=task sync-2798 [006] 611323.335817: writeback_queue: 8:0: pages=92680, sb=1, kupdate=0, range_cyclic=-1 for_background=0 sync-2798 [006] 611323.335819: writeback_sched: work=35c0, task=task sync-2798 [006] 611323.335855: writeback_queue: 253:16: pages=92680, sb=1, kupdate=0, range_cyclic=-1 for_background=0 sync-2798 [006] 611323.335857: writeback_sched: work=36c0, task=task sync-2798 [006] 611323.335890: writeback_queue: 8:0: pages=9223372036854775807, sb=1, kupdate=0, range_cyclic=0 for_background=0 sync-2798 [006] 611323.335891: writeback_sched: work=fe58, task=task sync-2798 [006] 611323.377341: writeback_queue: 253:16: pages=9223372036854775807, sb=1, kupdate=0, range_cyclic=0 for_background=0 sync-2798 [006] 611323.377346: writeback_sched: work=fe58, task=task This also lays the foundation for adding more writeback tracing to provide deeper insight into the whole writeback path. Signed-off-by: Jens Axboe Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/fs-writeback.c | 45 ++++++++-- include/trace/events/writeback.h | 171 ++++++++++++++++++++++++++++++++++++++ mm/backing-dev.c | 3 + 3 files changed, 209 insertions(+), 10 deletions(-) diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index ea8592b..ebfaed8 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -26,15 +26,9 @@ #include #include #include +#include #include "internal.h" -#define inode_to_bdi(inode) ((inode)->i_mapping->backing_dev_info) - -/* - * We don't actually have pdflush, but this one is exported though /proc... - */ -int nr_pdflush_threads; - /* * Passed into wb_writeback(), essentially a subset of writeback_control */ @@ -63,6 +57,21 @@ struct bdi_work { unsigned long state; /* flag bits, see WS_* */ }; +/* + * Include the creation of the trace points after defining the bdi_work and + * wb_writeback_args structures so that the definitions remain local to this + * file. + */ +#define CREATE_TRACE_POINTS +#include + +#define inode_to_bdi(inode) ((inode)->i_mapping->backing_dev_info) + +/* + * We don't actually have pdflush, but this one is exported though /proc... + */ +int nr_pdflush_threads; + enum { WS_USED_B = 0, WS_ONSTACK_B, @@ -137,6 +146,8 @@ static void wb_work_complete(struct bdi_work *work) static void wb_clear_pending(struct bdi_writeback *wb, struct bdi_work *work) { + trace_writeback_clear(work); + /* * The caller has retrieved the work arguments from this work, * drop our reference. If this is the last ref, delete and free it @@ -172,12 +183,16 @@ static void bdi_queue_work(struct backing_dev_info *bdi, struct bdi_work *work) * If the default thread isn't there, make sure we add it. When * it gets created and wakes up, we'll run this work. */ - if (unlikely(list_empty_careful(&bdi->wb_list))) + if (unlikely(list_empty_careful(&bdi->wb_list))) { + trace_writeback_sched(bdi, work, "default"); wake_up_process(default_backing_dev_info.wb.task); - else { + } else { struct bdi_writeback *wb = &bdi->wb; + struct task_struct *task = wb->task; - if (wb->task) + trace_writeback_sched(bdi, work, task ? "task" : "notask"); + + if (task) wake_up_process(wb->task); } } @@ -205,6 +220,7 @@ static void bdi_alloc_queue_work(struct backing_dev_info *bdi, work = kmalloc(sizeof(*work), GFP_ATOMIC); if (work) { bdi_work_init(work, args); + trace_writeback_queue(bdi, args); bdi_queue_work(bdi, work); if (wait) bdi_wait_on_work_clear(work); @@ -245,6 +261,7 @@ static void bdi_sync_writeback(struct backing_dev_info *bdi, bdi_work_init(&work, &args); work.state |= WS_ONSTACK; + trace_writeback_queue(bdi, &args); bdi_queue_work(bdi, &work); bdi_wait_on_work_clear(&work); } @@ -914,6 +931,8 @@ long wb_do_writeback(struct bdi_writeback *wb, int force_wait) struct wb_writeback_args args = work->args; int post_clear; + trace_writeback_exec(work); + /* * Override sync mode, in case we must wait for completion */ @@ -957,9 +976,13 @@ int bdi_writeback_task(struct bdi_writeback *wb) unsigned long wait_jiffies = -1UL; long pages_written; + trace_writeback_thread_start(1); + while (!kthread_should_stop()) { pages_written = wb_do_writeback(wb, 0); + trace_writeback_pages_written(pages_written); + if (pages_written) last_active = jiffies; else if (wait_jiffies != -1UL) { @@ -989,6 +1012,8 @@ int bdi_writeback_task(struct bdi_writeback *wb) try_to_freeze(); } + trace_writeback_thread_start(0); + return 0; } diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h new file mode 100644 index 0000000..6f510fa --- /dev/null +++ b/include/trace/events/writeback.h @@ -0,0 +1,171 @@ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM writeback + +#if !defined(_TRACE_WRITEBACK_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_WRITEBACK_H + +#include +#include + +TRACE_EVENT(writeback_queue, + + TP_PROTO(struct backing_dev_info *bdi, struct wb_writeback_args *args), + + TP_ARGS(bdi, args), + + TP_STRUCT__entry( + __array(char, name, 16) + __field(long, nr_pages) + __field(int, sb) + __field(int, sync_mode) + __field(int, for_kupdate) + __field(int, range_cyclic) + __field(int, for_background) + ), + + TP_fast_assign( + strlcpy(__entry->name, dev_name(bdi->dev), 16); + __entry->nr_pages = args->nr_pages; + __entry->sb = !!args->sb; + __entry->for_kupdate = args->for_kupdate; + __entry->range_cyclic = args->range_cyclic; + __entry->for_background = args->for_background; + ), + + TP_printk("%s: pages=%ld, sb=%d, kupdate=%d, range_cyclic=%d " + "for_background=%d", __entry->name, __entry->nr_pages, + __entry->sb, __entry->for_kupdate, + __entry->range_cyclic, __entry->for_background) +); + +TRACE_EVENT(writeback_sched, + + TP_PROTO(struct backing_dev_info *bdi, struct bdi_work *work, + const char *msg), + + TP_ARGS(bdi, work, msg), + + TP_STRUCT__entry( + __array(char, name, 16) + __field(unsigned int, work) + __array(char, task, 8) + ), + + TP_fast_assign( + strlcpy(__entry->name, dev_name(bdi->dev), 16); + __entry->work = (unsigned long) work & 0xffff; + snprintf(__entry->task, 8, "%s", msg); + ), + + TP_printk("work=%x, task=%s", __entry->work, __entry->task) +); + +TRACE_EVENT(writeback_exec, + + TP_PROTO(struct bdi_work *work), + + TP_ARGS(work), + + TP_STRUCT__entry( + __field(unsigned int, work) + __field(long, nr_pages) + __field(int, sb) + __field(int, sync_mode) + __field(int, for_kupdate) + __field(int, range_cyclic) + __field(int, for_background) + ), + + TP_fast_assign( + __entry->work = (unsigned long) work & 0xffff; + __entry->nr_pages = work->args.nr_pages; + __entry->sb = !!work->args.sb; + __entry->for_kupdate = work->args.for_kupdate; + __entry->range_cyclic = work->args.range_cyclic; + __entry->for_background = work->args.for_background; + + ), + + TP_printk("work=%x pages=%ld, sb=%d, kupdate=%d, range_cyclic=%d" + " for_background=%d", __entry->work, + __entry->nr_pages, __entry->sb, __entry->for_kupdate, + __entry->range_cyclic, __entry->for_background) +); + +TRACE_EVENT(writeback_clear, + + TP_PROTO(struct bdi_work *work), + + TP_ARGS(work), + + TP_STRUCT__entry( + __field(struct bdi_work *, work) + __field(int, refs) + ), + + TP_fast_assign( + __entry->work = work; + __entry->refs = atomic_read(&work->pending); + ), + + TP_printk("work=%p, refs=%d", __entry->work, __entry->refs) +); + +TRACE_EVENT(writeback_pages_written, + + TP_PROTO(long pages_written), + + TP_ARGS(pages_written), + + TP_STRUCT__entry( + __field(long, pages) + ), + + TP_fast_assign( + __entry->pages = pages_written; + ), + + TP_printk("%ld", __entry->pages) +); + + +TRACE_EVENT(writeback_thread_start, + + TP_PROTO(int start), + + TP_ARGS(start), + + TP_STRUCT__entry( + __field(int, start) + ), + + TP_fast_assign( + __entry->start = start; + ), + + TP_printk("%s", __entry->start ? "started" : "exited") +); + +TRACE_EVENT(writeback_bdi_register, + + TP_PROTO(const char *name, int start), + + TP_ARGS(name, start), + + TP_STRUCT__entry( + __array(char, name, 16) + __field(int, start) + ), + + TP_fast_assign( + strlcpy(__entry->name, name, 16); + __entry->start = start; + ), + + TP_printk("%s: %s", __entry->name, + __entry->start ? "registered" : "unregistered") +); +#endif /* _TRACE_WRITEBACK_H */ + +/* This part must be outside protection */ +#include diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 660a87a..1f7723b 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -10,6 +10,7 @@ #include #include #include +#include static atomic_long_t bdi_seq = ATOMIC_LONG_INIT(0); @@ -585,6 +586,7 @@ int bdi_register(struct backing_dev_info *bdi, struct device *parent, bdi_debug_register(bdi, dev_name(dev)); set_bit(BDI_registered, &bdi->state); + trace_writeback_bdi_register(dev_name(dev), 1); exit: return ret; } @@ -647,6 +649,7 @@ static void bdi_prune_sb(struct backing_dev_info *bdi) void bdi_unregister(struct backing_dev_info *bdi) { if (bdi->dev) { + trace_writeback_bdi_register(dev_name(bdi->dev), 0); bdi_prune_sb(bdi); if (!bdi_cap_flush_forker(bdi)) From SRS0+760P+4+fromorbit.com=david@internode.on.net Thu Jun 3 20:40:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o541e597191479 for ; Thu, 3 Jun 2010 20:40:05 -0500 X-ASG-Debug-ID: 1275615752-269800f10000-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 35999396208 for ; Thu, 3 Jun 2010 18:42:32 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id LKc7aXvCelveaLFF for ; Thu, 03 Jun 2010 18:42:32 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26721980-1927428 for multiple; Fri, 04 Jun 2010 11:12:31 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OKLvZ-0005Ec-Jx; Fri, 04 Jun 2010 11:42:29 +1000 Date: Fri, 4 Jun 2010 11:42:29 +1000 From: Dave Chinner To: Alex Elder Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: remove lazy per-AG initialization Subject: Re: [PATCH] xfs: remove lazy per-AG initialization Message-ID: <20100604014229.GD19651@dastard> References: <20100528175108.GA9421@infradead.org> <20100530230915.GA13732@dastard> <1275602290.2468.110.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1275602290.2468.110.camel@doink> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1275615754 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31560 Rule breakdown below pts rule 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, Jun 03, 2010 at 04:58:10PM -0500, Alex Elder wrote: > On Mon, 2010-05-31 at 09:09 +1000, Dave Chinner wrote: > > On Fri, May 28, 2010 at 01:51:08PM -0400, Christoph Hellwig wrote: > > > Historically XFS initializes the allocator / inode allocator per-AG > > > lazily, that is the first time this information is required. For > > > filesystems that use lazy superblock counters (which is the default now) > > > we already have to walk all AGs to initialize the superblock counters > > > on an unclean shutdown. > > > > Which is not common, so isn't frequently triggered in the normal > > mount process. The reason for the lazy initialisation is to speed > > the mount process up when there are thousands of AGs. That is, we > > avoid thousands of serialised IOs in the mount path. Have you > > checked to see what the impact is on the clean mount execution time > > is on such a filesystem? > > It's interesting that the time penalty you're talking about > doesn't go away, it just becomes less noticeable because it's > aggregated over subsequent access to the AG's. Right, the penalty is currently taken at access time, rather than at mount time. One way to test the impact is to compare the runtime difference for xfstests with MKFS_OPTIONS="-d agsize=16m" to bump up the AG count and see how much additional IO and time it takes... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+eH4A+4+fromorbit.com=david@internode.on.net Fri Jun 4 00:56:14 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o545uEJt204052 for ; Fri, 4 Jun 2010 00:56:14 -0500 X-ASG-Debug-ID: 1275631273-7a4d019e0000-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 2F825AC4873 for ; Thu, 3 Jun 2010 23:01:13 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id ettrtgYfD0DWO3O8 for ; Thu, 03 Jun 2010 23:01:13 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26715218-1927428 for multiple; Fri, 04 Jun 2010 15:28:39 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OKPvR-0005UH-PS; Fri, 04 Jun 2010 15:58:37 +1000 Date: Fri, 4 Jun 2010 15:58:37 +1000 From: Dave Chinner To: aelder@sgi.com Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: [GIT] fixes and cleanups for xfs-dev Subject: [GIT] fixes and cleanups for xfs-dev Message-ID: <20100604055837.GB20641@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1275631275 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31577 Rule breakdown below pts rule 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 Alex, Here are the latest list of reviewed patches for the xfs-dev tree. The inode cluster freeing fix really needs to go to Linus for .35 (and a .34-stable update is probably needed). You can leave Christoph's cleanups out if further discussion is needed - it is the above bug fix I'm pushing this branch out for. Cheers, Dave. The following changes since commit fb3b504adeee942e55393396fea8fdf406acf037: xfs: fix access to upper inodes without inode64 (2010-05-28 15:19:56 -0500) are available in the git repository at: git://git.kernel.org/pub/scm/git/linux/dgc/xfs for-dev Christoph Hellwig (17): xfs: remove done roadmap item from xfs-delayed-logging-design.txt xfs: skip writeback from reclaim context xfs: improve xfs_isilocked xfs: drop dmapi hooks xfs: remove unneeded #include statements xfs: simplify log item descriptor tracking xfs: merge iop_unpin_remove into iop_unpin xfs: give xfs_item_ops methods the correct prototypes xfs: give li_cb callbacks the correct prototype xfs: simplify buffer pinning xfs: simplify inode to transaction joining xfs: fix the xfs_log_iovec i_addr type xfs: kill the unused xlog_debug variable xfs: remove the unused XFS_LOG_SLEEP and XFS_LOG_NOSLEEP flags xfs: remove the unused XFS_TRANS_NOSLEEP/XFS_TRANS_WAIT flags xfs: remove unused XFS_BMAPI_ flags xfs: remove unused delta tracking code in xfs_bmapi Dave Chinner (1): xfs: fix race in inode cluster freeing failing to stale inodes .../filesystems/xfs-delayed-logging-design.txt | 5 - fs/xfs/Makefile | 4 +- fs/xfs/linux-2.6/xfs_aops.c | 26 +- fs/xfs/linux-2.6/xfs_buf.c | 33 +-- fs/xfs/linux-2.6/xfs_buf.h | 9 +- fs/xfs/linux-2.6/xfs_dmapi_priv.h | 28 -- fs/xfs/linux-2.6/xfs_export.c | 1 - fs/xfs/linux-2.6/xfs_file.c | 99 +----- fs/xfs/linux-2.6/xfs_fs_subr.c | 4 - fs/xfs/linux-2.6/xfs_fs_subr.h | 25 -- fs/xfs/linux-2.6/xfs_ioctl.c | 23 +- fs/xfs/linux-2.6/xfs_ioctl32.c | 4 - fs/xfs/linux-2.6/xfs_iops.c | 8 - fs/xfs/linux-2.6/xfs_linux.h | 1 - fs/xfs/linux-2.6/xfs_quotaops.c | 1 - fs/xfs/linux-2.6/xfs_super.c | 84 +--- fs/xfs/linux-2.6/xfs_super.h | 7 - fs/xfs/linux-2.6/xfs_sync.c | 14 +- fs/xfs/linux-2.6/xfs_trace.c | 4 - fs/xfs/linux-2.6/xfs_trace.h | 2 - fs/xfs/quota/xfs_dquot.c | 114 ++--- fs/xfs/quota/xfs_dquot_item.c | 301 ++++++-------- fs/xfs/quota/xfs_qm.c | 9 +- fs/xfs/quota/xfs_qm_bhv.c | 10 - fs/xfs/quota/xfs_qm_stats.c | 10 - fs/xfs/quota/xfs_qm_syscalls.c | 10 - fs/xfs/quota/xfs_trans_dquot.c | 35 +-- fs/xfs/support/debug.c | 1 - fs/xfs/xfs_alloc.c | 5 - fs/xfs/xfs_alloc_btree.c | 5 - fs/xfs/xfs_attr.c | 91 ++--- fs/xfs/xfs_attr_leaf.c | 5 +- fs/xfs/xfs_bmap.c | 300 ++------------ fs/xfs/xfs_bmap.h | 37 +-- fs/xfs/xfs_bmap_btree.c | 5 - fs/xfs/xfs_btree.c | 5 - fs/xfs/xfs_buf_item.c | 227 +++++------ fs/xfs/xfs_buf_item.h | 2 +- fs/xfs/xfs_da_btree.c | 14 +- fs/xfs/xfs_dfrag.c | 16 +- fs/xfs/xfs_dir2.c | 9 +- fs/xfs/xfs_dir2_block.c | 2 - fs/xfs/xfs_dir2_data.c | 2 - fs/xfs/xfs_dir2_leaf.c | 4 +- fs/xfs/xfs_dir2_node.c | 2 - fs/xfs/xfs_dir2_sf.c | 2 - fs/xfs/xfs_dmapi.h | 170 -------- fs/xfs/xfs_dmops.c | 55 --- fs/xfs/xfs_error.c | 4 - fs/xfs/xfs_extfree_item.c | 278 +++++------- fs/xfs/xfs_filestream.c | 4 - fs/xfs/xfs_fsops.c | 7 +- fs/xfs/xfs_ialloc.c | 4 - fs/xfs/xfs_ialloc_btree.c | 4 - fs/xfs/xfs_iget.c | 30 +- fs/xfs/xfs_inode.c | 175 ++++----- fs/xfs/xfs_inode_item.c | 250 ++++------- fs/xfs/xfs_inode_item.h | 12 +- fs/xfs/xfs_iomap.c | 26 +- fs/xfs/xfs_itable.c | 4 - fs/xfs/xfs_log.c | 7 +- fs/xfs/xfs_log.h | 11 +- fs/xfs/xfs_log_cil.c | 4 +- fs/xfs/xfs_log_recover.c | 42 +-- fs/xfs/xfs_mount.c | 3 - fs/xfs/xfs_mount.h | 67 --- fs/xfs/xfs_rename.c | 60 +--- fs/xfs/xfs_rtalloc.c | 9 +- fs/xfs/xfs_rw.c | 15 - fs/xfs/xfs_trans.c | 211 ++++++---- fs/xfs/xfs_trans.h | 117 +----- fs/xfs/xfs_trans_ail.c | 1 - fs/xfs/xfs_trans_buf.c | 75 +--- fs/xfs/xfs_trans_extfree.c | 23 +- fs/xfs/xfs_trans_inode.c | 74 ++--- fs/xfs/xfs_trans_item.c | 441 -------------------- fs/xfs/xfs_trans_priv.h | 18 +- fs/xfs/xfs_utils.c | 8 +- fs/xfs/xfs_vnodeops.c | 265 ++---------- 79 files changed, 973 insertions(+), 3106 deletions(-) delete mode 100644 fs/xfs/linux-2.6/xfs_dmapi_priv.h delete mode 100644 fs/xfs/linux-2.6/xfs_fs_subr.h delete mode 100644 fs/xfs/xfs_dmapi.h delete mode 100644 fs/xfs/xfs_dmops.c delete mode 100644 fs/xfs/xfs_trans_item.c -- Dave Chinner david@fromorbit.com From BATV+d2182a14c3c419587505+2476+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 4 02:46:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_ATTENTION autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o547kSc1209445 for ; Fri, 4 Jun 2010 02:46:30 -0500 X-ASG-Debug-ID: 1275637737-704b03b80000-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 49AC1396DE5 for ; Fri, 4 Jun 2010 00:48:58 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id NZWFX2dau1iIrS0K for ; Fri, 04 Jun 2010 00:48:58 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OKRe9-0001Et-1r; Fri, 04 Jun 2010 07:48:53 +0000 Date: Fri, 4 Jun 2010 03:48:53 -0400 From: Christoph Hellwig To: Dave Chinner Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: Re: [PATCH 4/6] writeback: pay attention to wbc->nr_to_write in write_cache_pages Subject: Re: [PATCH 4/6] writeback: pay attention to wbc->nr_to_write in write_cache_pages Message-ID: <20100604074852.GA4448@infradead.org> References: <1275609328-12514-1-git-send-email-david@fromorbit.com> <1275609328-12514-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1275609328-12514-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1275637738 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. Can please get this in ASAP, including -stable? > This commit adds a ->writepage tracepoint inside write_cache_pages() (how the > above trace was generated) and does the revert manually leaving the subsequent > bug fixes intact. ext4 is not affected by this as a previous commit in the > series stops ext4 from using the generic function. It doesn't anymore now that you've split it out.. From BATV+d2182a14c3c419587505+2476+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 4 02:47:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o547lAwV209487 for ; Fri, 4 Jun 2010 02:47:11 -0500 X-ASG-Debug-ID: 1275637932-6e2601780000-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 CDB96130DFE6 for ; Fri, 4 Jun 2010 00:52:12 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id bp9sH1guBqNRn42U for ; Fri, 04 Jun 2010 00:52:12 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OKRes-0001In-Le; Fri, 04 Jun 2010 07:49:38 +0000 Date: Fri, 4 Jun 2010 03:49:38 -0400 From: Christoph Hellwig To: Dave Chinner Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: Re: [PATCH 0/6] writeback: tracing and fixes V3. Subject: Re: [PATCH 0/6] writeback: tracing and fixes V3. Message-ID: <20100604074938.GB4448@infradead.org> References: <1275609328-12514-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1275609328-12514-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1275637932 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 Not sure what the rules for new tracepoints are, but in addition to the fixes I'd really love to see the tracepoints in 2.6.35. From BATV+d2182a14c3c419587505+2476+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 4 02:48:59 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o547mwip209627 for ; Fri, 4 Jun 2010 02:48:59 -0500 X-ASG-Debug-ID: 1275637887-153900370000-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 4676814803B0 for ; Fri, 4 Jun 2010 00:51:28 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id eEH9TSEbKAEcmjNU for ; Fri, 04 Jun 2010 00:51:28 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OKRgd-00027H-1r; Fri, 04 Jun 2010 07:51:27 +0000 Date: Fri, 4 Jun 2010 03:51:27 -0400 From: Christoph Hellwig To: Dave Chinner Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: Re: [PATCH 3/6] writeback: Add tracing to write_cache_pages Subject: Re: [PATCH 3/6] writeback: Add tracing to write_cache_pages Message-ID: <20100604075127.GA7317@infradead.org> References: <1275609328-12514-1-git-send-email-david@fromorbit.com> <1275609328-12514-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1275609328-12514-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1275637888 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, Jun 04, 2010 at 09:55:25AM +1000, Dave Chinner wrote: > Add a trace event to the ->writepage loop in write_cache_pages to give > visibility into how the ->writepage call is changing variables within the > writeback control structure. Of most interest is how wbc->nr_to_write changes > from call to call, especially with filesystems that write multiple pages > in ->writepage. Looks good, it might be worth to add another tracepoint for ->writepage from reclaim context so that we can start investigating the cases where that happens far too often. Reviewed-by: Christoph Hellwig From BATV+d2182a14c3c419587505+2476+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 4 02:49:57 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o547nvs5209688 for ; Fri, 4 Jun 2010 02:49:57 -0500 X-ASG-Debug-ID: 1275637946-16f7002a0000-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 61CF81481038 for ; Fri, 4 Jun 2010 00:52:26 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id SuoY9EQpBCWauGGx for ; Fri, 04 Jun 2010 00:52:26 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OKRhX-0002G5-TJ; Fri, 04 Jun 2010 07:52:23 +0000 Date: Fri, 4 Jun 2010 03:52:23 -0400 From: Christoph Hellwig To: Dave Chinner Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: Re: [PATCH 6/6] writeback: limit write_cache_pages integrity scanning to current EOF Subject: Re: [PATCH 6/6] writeback: limit write_cache_pages integrity scanning to current EOF Message-ID: <20100604075223.GB7317@infradead.org> References: <1275609328-12514-1-git-send-email-david@fromorbit.com> <1275609328-12514-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1275609328-12514-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: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1275637946 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 Even if there still are potential livelocks after this it's a big step in the right direction, so Reviewed-by: Christoph Hellwig From BATV+d2182a14c3c419587505+2476+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 4 02:52:12 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o547qC1l209830 for ; Fri, 4 Jun 2010 02:52:12 -0500 X-ASG-Debug-ID: 1275638234-6e2601b40000-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 65DBC130E0DE; Fri, 4 Jun 2010 00:57:14 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id HDvOkHB5IMuRgfbE; Fri, 04 Jun 2010 00:57:14 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1OKRjk-0002ge-Lo; Fri, 04 Jun 2010 07:54:40 +0000 Date: Fri, 4 Jun 2010 03:54:40 -0400 From: Christoph Hellwig To: Dave Chinner Cc: aelder@sgi.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [GIT] fixes and cleanups for xfs-dev Subject: Re: [GIT] fixes and cleanups for xfs-dev Message-ID: <20100604075440.GA9325@infradead.org> References: <20100604055837.GB20641@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100604055837.GB20641@dastard> User-Agent: Mutt/1.5.19 (2009-01-05) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1275638234 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, Jun 04, 2010 at 03:58:37PM +1000, Dave Chinner wrote: > Hi Alex, > > Here are the latest list of reviewed patches for the xfs-dev tree. > The inode cluster freeing fix really needs to go to Linus for .35 > (and a .34-stable update is probably needed). Yes, getting the current queue on oss plus the first fout patches from your pull request into .35 ASAP would be a good thing. From npiggin@suse.de Fri Jun 4 02:53:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o547roZV209905 for ; Fri, 4 Jun 2010 02:53:51 -0500 X-ASG-Debug-ID: 1275638331-712601950000-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 D4ECF130E447 for ; Fri, 4 Jun 2010 00:58:52 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id MRAsm72xeTNg6UZs for ; Fri, 04 Jun 2010 00:58:52 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 1EBA48E8CC; Fri, 4 Jun 2010 09:56:17 +0200 (CEST) Received: by laptop.local0.net (Postfix, from userid 1000) id 72C4A29819; Fri, 4 Jun 2010 17:56:14 +1000 (EST) Date: Fri, 4 Jun 2010 17:56:14 +1000 From: Nick Piggin To: Christoph Hellwig Cc: Dave Chinner , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: Re: [PATCH 6/6] writeback: limit write_cache_pages integrity scanning to current EOF Subject: Re: [PATCH 6/6] writeback: limit write_cache_pages integrity scanning to current EOF Message-ID: <20100604075614.GB26335@laptop> References: <1275609328-12514-1-git-send-email-david@fromorbit.com> <1275609328-12514-7-git-send-email-david@fromorbit.com> <20100604075223.GB7317@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100604075223.GB7317@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: 1275638332 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, Jun 04, 2010 at 03:52:23AM -0400, Christoph Hellwig wrote: > Even if there still are potential livelocks after this it's a big > step in the right direction, so > > > Reviewed-by: Christoph Hellwig Agreed. From mailman@sgi.com Fri Jun 4 06:08:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.8 required=5.0 tests=BAYES_50,HTML_MESSAGE, MIME_BASE64_BLANKS,T_FILL_THIS_FORM_SHORT autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o54B8Sjv219036 for ; Fri, 4 Jun 2010 06:08:28 -0500 From: "cuda.sgi.com" To: Subject: User Quarantine Account Information Content-Type: multipart/related; boundary="Barracuda.28501908438568" Mime-Version: 1.0 Message-Id: <20100604111058.21F7339755A@cuda.sgi.com> Date: Fri, 4 Jun 2010 04:10:58 -0700 (PDT) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --Barracuda.28501908438568 Content-Type: multipart/alternative; boundary="Barracuda.28501990047907" --Barracuda.28501990047907 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 V2VsY29tZSB0byB0aGUgY3VkYS5zZ2kuY29tLiAgVGhpcyBtZXNzYWdlIGNvbnRhaW5zIHRoZSBp bmZvcm1hdGlvbiB5b3Ugd2lsbCBuZWVkIHRvIGFjY2VzcyB5b3VyIFNwYW0gUXVhcmFudGluZSBh bmQgUHJlZmVyZW5jZXMuCgpZb3VyIGFjY291bnQgaGFzIGJlZW4gc2V0IHRvIHRoZSBmb2xsb3dp bmcgdXNlcm5hbWUgYW5kIHBhc3N3b3JkOgogICAgVXNlcm5hbWU6IHhmc0Bvc3Muc2dpLmNvbQog ICAgUGFzc3dvcmQ6IHhmc2p1azUKCkFjY2VzcyB5b3VyIFNwYW0gUXVhcmFudGluZSBkaXJlY3Rs eSB1c2luZyB0aGUgZm9sbG93aW5nIGxpbms6IGh0dHA6Ly9jdWRhLnNnaS5jb206ODAvY2dpLWJp bi9pbmRleC5jZ2k/dXNlcj14ZnNAb3NzLnNnaS5jb20mcGFzc3dvcmQ9YjRiYWY5ZGQ0MTJjMjA2 MGMxNmFiOWI1NDg0OWZjODAmZXQ9MTI3NjA4MTg1OAoKCg== --Barracuda.28501990047907 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PGh0bWw+CjxzdHlsZSB0eXBlPSd0ZXh0L2Nzcyc+Ci5lcnJvciB7IGJvcmRlci1jb2xvcjogI2Zm MDAwMDsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiAxcHggfQouYm94IHsgdGV4 dC1hbGlnbjogY2VudGVyOyBib3JkZXItY29sb3I6ICMwMDAwMDA7IGJvcmRlci1zdHlsZTogc29s aWQ7IGJvcmRlci13aWR0aDogMXB4IH0KLmJveF9ub2NlbnRlciB7IGJvcmRlci1jb2xvcjogIzAw MDAwMDsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiAxcHggfQouaGVscGJveCB7 IGJhY2tncm91bmQtY29sb3I6ICNkZGRkZGQ7IGZvbnQtc2l6ZTogOHB0OyBtYXJnaW4tbGVmdDog MTVweDsgbWFyZ2luLXRvcDogNXB4OyBtYXJnaW4tYm90dG9tOiA1cHg7IHBhZGRpbmc6IDFweDsg Ym9yZGVyLWNvbG9yOiAjOTk5OTk5OyBib3JkZXItc3R5bGU6IHNvbGlkOyBib3JkZXItd2lkdGg6 IDFweCB9Ci5oZWxwdHh0IHsgYmFja2dyb3VuZC1jb2xvcjogI2RkZGRkZDsgZm9udC1zaXplOiA4 cHQ7IG1hcmdpbi1sZWZ0OiAwcHg7IG1hcmdpbi10b3A6IDBweDsgbWFyZ2luLWJvdHRvbTogMHB4 OyBwYWRkaW5nOiAxcHg7IH0KLndhcm5pbmdib3ggeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUy OyBmb250LXNpemU6IDhwdDsgYm9yZGVyLWNvbG9yOiAjODg4ODg4OyBib3JkZXItc3R5bGU6IHNv bGlkOyBib3JkZXItd2lkdGg6IDFweCB9Ci5jb25maWdfc2NyZWVuIHsgZm9udC1zaXplOiAxMHB0 OyBmb250LWZhbWlseTogVmVyZGFuYSxHZW5ldmEsQXJpYWwsU2Fucy1zZXJpZjsgYm9yZGVyLWNv bG9yOiAjNGY0ZjRmOyBib3JkZXItbGVmdC1zdHlsZTogc29saWQ7IGJvcmRlci1yaWdodC1zdHls ZTogc29saWQ7IGJvcmRlci1ib3R0b20tc3R5bGU6IHNvbGlkOyBib3JkZXItd2lkdGg6IDFweCB9 Ci5jb25maWdfbW9kdWxlIHsgZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxH ZW5ldmEsQXJpYWwsU2Fucy1zZXJpZjsgfQouY29uZmlnX21vZHVsZV90ciB7IGZvbnQtc2l6ZTog MTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsR2VuZXZhLEFyaWFsLFNhbnMtc2VyaWY7IH0KLmNv bmZpZ19tb2R1bGVfdHIyIHsgZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxH ZW5ldmEsQXJpYWwsU2Fucy1zZXJpZjsgYmFja2dyb3VuZC1jb2xvcjojZGRkZGRkfQoubWVzc2Fn ZV9yb3cgeyBmb250LXNpemU6IHh4LXNtYWxsOyBmb250LWZhbWlseTogVmVyZGFuYSxHZW5ldmEs QXJpYWwsU2Fucy1zZXJpZjsgfQoubWVzc2FnZV9yb3dfYnV0dG9uIHsgZm9udC1zaXplOiA3cHQ7 IGZvbnQtZmFtaWx5OiBWZXJkYW5hLEdlbmV2YSxBcmlhbCxTYW5zLXNlcmlmOyB9Ci5tbG9nX21l c3NhZ2Vfcm93X2J1dHRvbiB7IGZvbnQtc2l6ZTogOXB0OyBmb250LWZhbWlseTogVmVyZGFuYSxH ZW5ldmEsQXJpYWwsU2Fucy1zZXJpZjsgfQoubWxvZ19tZXNzYWdlX3Jvd19idXR0b25fYm9sZCB7 IGZvbnQtc2l6ZTogOXB0OyBmb250LWZhbWlseTogVmVyZGFuYSxHZW5ldmEsQXJpYWwsU2Fucy1z ZXJpZjsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLm1lc3NhZ2Vfcm93X2J1dHRvbl9ncmVlbiB7IGNv bG9yOiBkYXJrZ3JlZW47IGZvbnQtc2l6ZTogN3B0OyBmb250LWZhbWlseTogVmVyZGFuYSxHZW5l dmEsQXJpYWwsU2Fucy1zZXJpZjsgfQoubWVzc2FnZV9yb3dfYnV0dG9uX3JlZCB7IGNvbG9yOiBy ZWQ7IGZvbnQtc2l6ZTogN3B0OyBmb250LWZhbWlseTogVmVyZGFuYSxHZW5ldmEsQXJpYWwsU2Fu cy1zZXJpZjsgfQoubWVzc2FnZV9yb3cyIHsgYmFja2dyb3VuZC1jb2xvcjogI2QyZDJkMjsgZm9u dC1zaXplOiA3cHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLEdlbmV2YSxBcmlhbCxTYW5zLXNlcmlm OyB9Ci5zdGF0dXNfc2NyZWVuIHsgZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFu YSxHZW5ldmEsQXJpYWwsU2Fucy1zZXJpZjsgYm9yZGVyLWNvbG9yOiAjNGY0ZjRmOyBib3JkZXIt bGVmdC1zdHlsZTogc29saWQ7IGJvcmRlci1yaWdodC1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0 aDogMXB4IH0KLnN0YXR1c19zY3JlZW5fd29yZCB7IGNvbG9yOiAjNGY0ZjRmOyBmb250LXNpemU6 IDlwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsR2VuZXZhLEFyaWFsLFNhbnMtc2VyaWY7IGJvcmRl ci13aWR0aDogMHB4IH0KLnNlY29uZGFyeV9tZW51IHsgYm9yZGVyLWNvbG9yOiAjNGY0ZjRmOyBi b3JkZXItbGVmdC1zdHlsZTogc29saWQ7IGJvcmRlci1yaWdodC1zdHlsZTogc29saWQ7IGJvcmRl ci13aWR0aDogMXB4IH0KLmJveF90b3AgeyBib3JkZXItdG9wLXN0eWxlOiBzb2xpZDsgYm9yZGVy LXRvcC13aWR0aDogMnB4OyBib3JkZXItdG9wLWNvbG9yOiAjMDAwMDAwOyB9Ci5ib3hfdG9wX3Bh ZGRlZCB7IHBhZGRpbmctdG9wOiAzcHg7IHBhZGRpbmctYm90dG9tOiAzcHg7IGJvcmRlci10b3At c3R5bGU6IHNvbGlkOyBib3JkZXItdG9wLXdpZHRoOiAycHg7IGJvcmRlci10b3AtY29sb3I6ICMw MDAwMDA7IH0KLmJveF9ib3R0b20geyBib3JkZXItYm90dG9tLXN0eWxlOiBzb2xpZDsgYm9yZGVy LWJvdHRvbS13aWR0aDogMnB4OyBib3JkZXItYm90dG9tLWNvbG9yOiAjMDAwMDAwOyB9Ci5ib3hf Ym90dG9tX3BhZGRlZCB7IHBhZGRpbmctYm90dG9tOiAzcHg7IGJvcmRlci1ib3R0b20tc3R5bGU6 IHNvbGlkOyBib3JkZXItYm90dG9tLXdpZHRoOiAycHg7IGJvcmRlci1ib3R0b20tY29sb3I6ICMw MDAwMDA7IH0KLmJveF9hZGRfbGVmdCB7IHBhZGRpbmctYm90dG9tOiAzcHg7IHBhZGRpbmctdG9w OiAzcHg7IGJvcmRlci1sZWZ0LXN0eWxlOiBzb2xpZDsgYm9yZGVyLWxlZnQtd2lkdGg6IDJweDsg Ym9yZGVyLWxlZnQtY29sb3I6ICMwMDAwMDA7IGJvcmRlci10b3Atc3R5bGU6IHNvbGlkOyBib3Jk ZXItdG9wLXdpZHRoOiAxcHg7IGJvcmRlci10b3AtY29sb3I6ICMwMDAwMDA7IGJvcmRlci1ib3R0 b20tc3R5bGU6IHNvbGlkOyBib3JkZXItYm90dG9tLXdpZHRoOiAxcHg7IGJvcmRlci1ib3R0b20t Y29sb3I6ICMwMDAwMDA7fQouYm94X2FkZF9taWQgeyBwYWRkaW5nLWJvdHRvbTogM3B4OyBwYWRk aW5nLXRvcDogM3B4OyBib3JkZXItdG9wLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXRvcC13aWR0aDog MXB4OyBib3JkZXItdG9wLWNvbG9yOiAjMDAwMDAwOyBib3JkZXItYm90dG9tLXN0eWxlOiBzb2xp ZDsgYm9yZGVyLWJvdHRvbS13aWR0aDogMXB4OyBib3JkZXItYm90dG9tLWNvbG9yOiAjMDAwMDAw O30KLmJveF9hZGRfcmlnaHQgeyBwYWRkaW5nLWJvdHRvbTogM3B4OyBwYWRkaW5nLXRvcDogM3B4 OyBib3JkZXItcmlnaHQtc3R5bGU6IHNvbGlkOyBib3JkZXItcmlnaHQtd2lkdGg6IDJweDsgYm9y ZGVyLXJpZ2h0LWNvbG9yOiAjMDAwMDAwOyBib3JkZXItdG9wLXN0eWxlOiBzb2xpZDsgYm9yZGVy LXRvcC13aWR0aDogMXB4OyBib3JkZXItdG9wLWNvbG9yOiAjMDAwMDAwOyBib3JkZXItYm90dG9t LXN0eWxlOiBzb2xpZDsgYm9yZGVyLWJvdHRvbS13aWR0aDogMXB4OyBib3JkZXItYm90dG9tLWNv bG9yOiAjMDAwMDAwO30KLmJveF9sZWZ0IHsgYm9yZGVyLWxlZnQtc3R5bGU6IHNvbGlkOyBib3Jk ZXItbGVmdC13aWR0aDogMnB4OyBib3JkZXItbGVmdC1jb2xvcjogIzAwMDAwMDsgfQouYm94X3Jp Z2h0IHsgYm9yZGVyLXJpZ2h0LXN0eWxlOiBzb2xpZDsgYm9yZGVyLXJpZ2h0LXdpZHRoOiAycHg7 IGJvcmRlci1yaWdodC1jb2xvcjogIzAwMDAwMDsgfQouYm94X3RsIHsgYm9yZGVyLXRvcC1zdHls ZTogc29saWQ7IGJvcmRlci10b3Atd2lkdGg6IDJweDsgYm9yZGVyLXRvcC1jb2xvcjogIzAwMDAw MDsKICBib3JkZXItbGVmdC1zdHlsZTogc29saWQ7IGJvcmRlci1sZWZ0LXdpZHRoOiAycHg7IGJv cmRlci1sZWZ0LWNvbG9yOiAjMDAwMDAwOwp9Ci5ib3hfdGxfcGFkZGVkIHsgcGFkZGluZy10b3A6 IDNweDsgYm9yZGVyLXRvcC1zdHlsZTogc29saWQ7IGJvcmRlci10b3Atd2lkdGg6IDJweDsgYm9y ZGVyLXRvcC1jb2xvcjogIzAwMDAwMDsKICBib3JkZXItbGVmdC1zdHlsZTogc29saWQ7IGJvcmRl ci1sZWZ0LXdpZHRoOiAycHg7IGJvcmRlci1sZWZ0LWNvbG9yOiAjMDAwMDAwOwp9Ci5ib3hfYmwg eyBib3JkZXItYm90dG9tLXN0eWxlOiBzb2xpZDsgYm9yZGVyLWJvdHRvbS13aWR0aDogMnB4OyBi b3JkZXItYm90dG9tLWNvbG9yOiAjMDAwMDAwOwogIGJvcmRlci1sZWZ0LXN0eWxlOiBzb2xpZDsg Ym9yZGVyLWxlZnQtd2lkdGg6IDJweDsgYm9yZGVyLWxlZnQtY29sb3I6ICMwMDAwMDA7Cn0KLmJv eF9ibF9wYWRkZWQgeyBwYWRkaW5nLWJvdHRvbTogM3B4OyBib3JkZXItYm90dG9tLXN0eWxlOiBz b2xpZDsgYm9yZGVyLWJvdHRvbS13aWR0aDogMnB4OyBib3JkZXItYm90dG9tLWNvbG9yOiAjMDAw MDAwOwogIGJvcmRlci1sZWZ0LXN0eWxlOiBzb2xpZDsgYm9yZGVyLWxlZnQtd2lkdGg6IDJweDsg Ym9yZGVyLWxlZnQtY29sb3I6ICMwMDAwMDA7Cn0KLmJveF90ciB7IGJvcmRlci10b3Atc3R5bGU6 IHNvbGlkOyBib3JkZXItdG9wLXdpZHRoOiAycHg7IGJvcmRlci10b3AtY29sb3I6ICMwMDAwMDA7 CiAgYm9yZGVyLXJpZ2h0LXN0eWxlOiBzb2xpZDsgYm9yZGVyLXJpZ2h0LXdpZHRoOiAycHg7IGJv cmRlci1yaWdodC1jb2xvcjogIzAwMDAwMDsKfQouYm94X3RyX3BhZGRlZCB7IHBhZGRpbmctdG9w OiAzcHg7IGJvcmRlci10b3Atc3R5bGU6IHNvbGlkOyBib3JkZXItdG9wLXdpZHRoOiAycHg7IGJv cmRlci10b3AtY29sb3I6ICMwMDAwMDA7CiAgYm9yZGVyLXJpZ2h0LXN0eWxlOiBzb2xpZDsgYm9y ZGVyLXJpZ2h0LXdpZHRoOiAycHg7IGJvcmRlci1yaWdodC1jb2xvcjogIzAwMDAwMDsKfQouYm94 X2JyIHsgYm9yZGVyLWJvdHRvbS1zdHlsZTogc29saWQ7IGJvcmRlci1ib3R0b20td2lkdGg6IDJw eDsgYm9yZGVyLWJvdHRvbS1jb2xvcjogIzAwMDAwMDsKICBib3JkZXItcmlnaHQtc3R5bGU6IHNv bGlkOyBib3JkZXItcmlnaHQtd2lkdGg6IDJweDsgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjMDAwMDAw Owp9Ci5ib3hfYnJfcGFkZGVkIHsgcGFkZGluZy1ib3R0b206IDNweDsgYm9yZGVyLWJvdHRvbS1z dHlsZTogc29saWQ7IGJvcmRlci1ib3R0b20td2lkdGg6IDJweDsgYm9yZGVyLWJvdHRvbS1jb2xv cjogIzAwMDAwMDsKICBib3JkZXItcmlnaHQtc3R5bGU6IHNvbGlkOyBib3JkZXItcmlnaHQtd2lk dGg6IDJweDsgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjMDAwMDAwOwp9Ci5ib3hfbHIgeyBib3JkZXIt bGVmdC1zdHlsZTogc29saWQ7IGJvcmRlci1sZWZ0LXdpZHRoOiAycHg7IGJvcmRlci1sZWZ0LWNv bG9yOiAjMDAwMDAwOwogIGJvcmRlci1yaWdodC1zdHlsZTogc29saWQ7IGJvcmRlci1yaWdodC13 aWR0aDogMnB4OyBib3JkZXItcmlnaHQtY29sb3I6ICMwMDAwMDA7Cn0KLmJ1dHRvbiB7IHRleHQt YWxpZ246IGNlbnRlcjsgYm9yZGVyLXN0eWxlOiBvdXRzZXQ7IGJvcmRlci13aWR0aDogMnB4OyBt YXJnaW46IDFweDsgfQouYnV0dG9uX3NlbGVjdGVkIHsgdGV4dC1hbGlnbjogY2VudGVyOyBib3Jk ZXItc3R5bGU6IGluc2V0OyBib3JkZXItd2lkdGg6IDJweDsgbWFyZ2luOiAxcHg7IH0KLmJ1dHRv bjIgeyBmb250LXNpemU6IDlwdDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBWZXJk YW5hLEdlbmV2YSxBcmlhbCxTYW5zLXNlcmlmOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGJvcmRlci1z dHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyBtYXJnaW46IDFweDsgYm9yZGVyLWNvbG9y OiB3aGl0ZTt9Ci5idXR0b24yX3NlbGVjdGVkIHsgZm9udC1zaXplOiA5cHQ7IGZvbnQtd2VpZ2h0 OiBib2xkOyBmb250LWZhbWlseTogVmVyZGFuYSxHZW5ldmEsQXJpYWwsU2Fucy1zZXJpZjsgdGV4 dC1hbGlnbjogY2VudGVyOyBib3JkZXItbGVmdC1zdHlsZTogc29saWQ7ICBib3JkZXItcmlnaHQt c3R5bGU6IHNvbGlkOyAgYm9yZGVyLXRvcC1zdHlsZTogc29saWQ7IGJvcmRlci1ib3R0b20tc3R5 bGU6IG5vbmU7IGJvcmRlci1ib3R0b20td2lkdGg6IDJweDsgYm9yZGVyLWxlZnQtd2lkdGg6IDFw eDsgYm9yZGVyLXJpZ2h0LXdpZHRoOiAxcHg7IGJvcmRlci10b3Atd2lkdGg6IDFweDsgbWFyZ2lu OiAwcHg7IGJvcmRlci1jb2xvcjogIzg4ODg4ODt9Ci5idXR0b24zIHsgYm9yZGVyLWNvbG9yOiAj MzMzMzMzOyBib3JkZXItc3R5bGU6IHNvbGlkOyBib3JkZXItd2lkdGg6IDFweDsgZm9udC1zaXpl OiA5cHQ7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LWZhbWlseTogVmVyZGFuYSxHZW5ldmEsQXJp YWwsU2Fucy1zZXJpZjsgdGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW46IDFweDsgYmFja2dyb3Vu ZC1jb2xvcjogIzg4ODg4ODsgfQouYnV0dG9uM19leHBlcnQgeyBib3JkZXItY29sb3I6ICMzMzMz MzM7IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyBmb250LXNpemU6IDlw dDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLEdlbmV2YSxBcmlhbCxT YW5zLXNlcmlmOyB0ZXh0LWFsaWduOiBjZW50ZXI7IG1hcmdpbjogMXB4OyBiYWNrZ3JvdW5kLWNv bG9yOiAjRkZBQUFBOyB9CmgxIHsgZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFu YSxHZW5ldmEsQXJpYWwsU2Fucy1zZXJpZjsgfQpwIHsgZm9udC1zaXplOiAxMHB0OyBmb250LWZh bWlseTogVmVyZGFuYSxHZW5ldmEsQXJpYWwsU2Fucy1zZXJpZjsgfQouY2VudGVyX3AgeyB0ZXh0 LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsR2Vu ZXZhLEFyaWFsLFNhbnMtc2VyaWY7IH0KLnNtYWxsX2xpbmsgeyBmb250LXNpemU6IDEwcHQ7IGZv bnQtZmFtaWx5OiBWZXJkYW5hLEdlbmV2YSxBcmlhbCxTYW5zLXNlcmlmOyB9CmxpIHsgZm9udC1z aXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxHZW5ldmEsQXJpYWwsU2Fucy1zZXJpZjsg fQpkdCB7IGZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsR2VuZXZhLEFyaWFs LFNhbnMtc2VyaWY7IH0KZGwgeyBtYXJnaW4tbGVmdDogMjBweDsgbWFyZ2luLWJvdHRvbTogNXB4 OyBmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLEdlbmV2YSxBcmlhbCxTYW5z LXNlcmlmOyB9CmE6bGluayB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQphOnZpc2l0ZWQgeyB0 ZXh0LWRlY29yYXRpb246IG5vbmU7IH0KYTpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6ICM2NjY2 NjY7IH0KYS5zbWFsbDpsaW5rIHsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXNpemU6IDhw dDsgfQphLnNtYWxsOnZpc2l0ZWQgeyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtc2l6ZTog OHB0OyB9CmEuc21hbGw6aG92ZXIgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgZm9udC1z aXplOiA4cHQ7IGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWV9CmEubm9ybWFsOmxpbmsgeyB0ZXh0 LWRlY29yYXRpb246IG5vbmU7IH0KYS5ub3JtYWw6dmlzaXRlZCB7IHRleHQtZGVjb3JhdGlvbjog bm9uZTsgfQphLm5vcm1hbDpob3ZlciB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyBiYWNr Z3JvdW5kLWNvbG9yOiAjZWVlZWVlfQphLnN0YXR1czpsaW5rIHsgdGV4dC1kZWNvcmF0aW9uOiB1 bmRlcmxpbmU7IH0KYS5zdGF0dXM6dmlzaXRlZCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9CmEuc3RhdHVzOmhvdmVyIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IGJhY2tncm91 bmQtY29sb3I6ICNlZWVlZWV9CmEuZXJyb3I6bGluayB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJs aW5lOyBjb2xvcjojZmYwMDAwOyBiYWNrZ3JvdW5kLWNvbG9yOiNlZWVlZWU7IGJvcmRlci1zdHls ZTpub25lOyBib3JkZXItd2lkdGg6MHB4IH0KYS5lcnJvcjp2aXNpdGVkIHsgdGV4dC1kZWNvcmF0 aW9uOiB1bmRlcmxpbmU7IGNvbG9yOiNmZjAwMDA7IGJhY2tncm91bmQtY29sb3I6I2VlZWVlZTsg Ym9yZGVyLXN0eWxlOm5vbmU7IGJvcmRlci13aWR0aDowcHh9CmEuZXJyb3I6aG92ZXIgeyB0ZXh0 LWRlY29yYXRpb246IHVuZGVybGluZTsgY29sb3I6I2ZmMDAwMDsgYmFja2dyb3VuZC1jb2xvcjoj ZWVlZWVlOyBib3JkZXItd2lkdGg6MHB4OyBib3JkZXItc3R5bGU6bm9uZX0KYS5leHBlcnQ6bGlu ayB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQphLmV4cGVydDp2aXNpdGVkIHsgdGV4dC1kZWNv cmF0aW9uOiBub25lOyB9CmEuZXhwZXJ0OmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogI0ZGNTU1 NTsgfQphLnRyYW5zYnV0dG9uOmxpbmsgeyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IH0KYS50cmFu c2J1dHRvbjpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyB0ZXh0LWRlY29y YXRpb246IG5vbmU7IH0KYS50cmFuc2J1dHRvbjp2aXNpdGVkIHsgdGV4dC1kZWNvcmF0aW9uOiBu b25lOyB9Ci5idXR0b24zX3NlbGVjdGVkIHsgZm9udC1zaXplOiA5cHQ7IGJvcmRlci1zdHlsZTog c29saWQ7IGJvcmRlci13aWR0aDogMXB4OyBib3JkZXItY29sb3I6ICMzMzMzMzM7IGNvbG9yOiAj Y2NjY2NjOyBmb250LXdlaWdodDogYm9sZDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsR2VuZXZhLEFy aWFsLFNhbnMtc2VyaWY7IHRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luOiAxcHg7IGJhY2tncm91 bmQtY29sb3I6ICM2NjY2NjY7IH0KLmJ1dHRvbjNfc2VsZWN0ZWRfZXhwZXJ0IHsgZm9udC1zaXpl OiA5cHQ7IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4OyBib3JkZXItY29s b3I6ICMzMzMzMzM7IGNvbG9yOiAjY2NjY2NjOyBmb250LXdlaWdodDogYm9sZDsgZm9udC1mYW1p bHk6IFZlcmRhbmEsR2VuZXZhLEFyaWFsLFNhbnMtc2VyaWY7IHRleHQtYWxpZ246IGNlbnRlcjsg bWFyZ2luOiAxcHg7IGJhY2tncm91bmQtY29sb3I6ICNGRjU1NTU7IH0KLmJ1dHRvbjQgeyBmb250 LXNpemU6IDlwdDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLEdlbmV2 YSxBcmlhbCxTYW5zLXNlcmlmOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGJvcmRlci1zdHlsZTogb3V0 c2V0OyBib3JkZXItd2lkdGg6IDJweDsgbWFyZ2luOiAxcHg7IH0KLmJ1dHRvbjRfc2VsZWN0ZWQg eyBmb250LXNpemU6IDlwdDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5h LEdlbmV2YSxBcmlhbCxTYW5zLXNlcmlmOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGJvcmRlci1zdHls ZTogaW5zZXQ7IGJvcmRlci13aWR0aDogMnB4OyBtYXJnaW46IDFweDsgfQouaXBfaW5wdXQgeyBi b3JkZXItc3R5bGU6IGluc2V0OyBib3JkZXItd2lkdGg6IDJweDsgfQoub2N0ZXRfaW5wdXQgeyBi b3JkZXItd2lkdGg6IDA7IGJvcmRlci1zdHlsZTogbm9uZTsgd2lkdGg6IDMwcHg7IHRleHQtYWxp Z246IGNlbnRlcjsgfQoudGV4dGFyZWFfZGlzcGxheSB7IGJvcmRlci1zdHlsZTogc29saWQ7IGJv cmRlci13aWR0aDogMXB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlOyB9Ci5kaWFnbV9ub3Jt YWwgeyBib3JkZXItc3R5bGU6IHNvbGlkOyBib3JkZXItd2lkdGg6IDVweDsgfQouZGlhZ21fcmVk IHsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiA1cHg7IGJvcmRlci1jb2xvcjog I2ZmMDAwMCB9Ci5ub3dyYXAgeyB3aGl0ZS1zcGFjZTogbm93cmFwOyB9Cgo8L3N0eWxlPjxib2R5 PldlbGNvbWUgdG8gdGhlIGN1ZGEuc2dpLmNvbS4gJm5ic3A7VGhpcyBtZXNzYWdlIGNvbnRhaW5z IHRoZSBpbmZvcm1hdGlvbiB5b3Ugd2lsbCBuZWVkIHRvIGFjY2VzcyB5b3VyIFNwYW0gUXVhcmFu dGluZSBhbmQgUHJlZmVyZW5jZXMuPGJyPgo8YnI+CllvdXIgYWNjb3VudCBoYXMgYmVlbiBzZXQg dG8gdGhlIGZvbGxvd2luZyB1c2VybmFtZSBhbmQgcGFzc3dvcmQ6PGJyPgogJm5ic3A7ICZuYnNw O1VzZXJuYW1lOiB4ZnNAb3NzLnNnaS5jb208YnI+CiAmbmJzcDsgJm5ic3A7UGFzc3dvcmQ6IHhm c2p1azU8YnI+Cjxicj4KQWNjZXNzIHlvdXIgU3BhbSBRdWFyYW50aW5lIGRpcmVjdGx5IHVzaW5n IHRoZSBmb2xsb3dpbmcgbGluazogPGEgaHJlZj1odHRwOi8vY3VkYS5zZ2kuY29tOjgwL2NnaS1i aW4vaW5kZXguY2dpP3VzZXI9eGZzQG9zcy5zZ2kuY29tJnBhc3N3b3JkPWI0YmFmOWRkNDEyYzIw NjBjMTZhYjliNTQ4NDlmYzgwJmV0PTEyNzYwODE4NTg+aHR0cDovL2N1ZGEuc2dpLmNvbTo4MC9j Z2ktYmluL2luZGV4LmNnaT91c2VyPXhmc0Bvc3Muc2dpLmNvbSZwYXNzd29yZD1iNGJhZjlkZDQx MmMyMDYwYzE2YWI5YjU0ODQ5ZmM4MCZldD0xMjc2MDgxODU4PC9hPjxicj4KPGJyPgo8L2JvZHk+ PC9odG1sPgo= --Barracuda.28501990047907-- --Barracuda.28501908438568-- From sandeen@sandeen.net Fri Jun 4 10:24:43 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_64, T_FRT_LOLITA1 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o54FOguW231190 for ; Fri, 4 Jun 2010 10:24:43 -0500 X-ASG-Debug-ID: 1275665230-420d00aa0000-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 6BD9E1E05EB3 for ; Fri, 4 Jun 2010 08:27:10 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id njoMZgyJtLfS8wcG for ; Fri, 04 Jun 2010 08:27:10 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 804FA46AD993 for ; Fri, 4 Jun 2010 10:27:10 -0500 (CDT) Message-ID: <4C091B4E.5030503@sandeen.net> Date: Fri, 04 Jun 2010 10:27:10 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: [PATCH] xfstests: use stat not lstat when examining devices Subject: [PATCH] xfstests: use stat not lstat when examining devices 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: 1275665231 X-Barracuda-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.31615 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 If you try running xfstests on lvm volumes which are symlinks, it'll fail to run several tests because our _require_scratch framework ultimately uses lstat not stat, and does not think the lvm device (which is usually a symlink to a dm-X device) is a block device. Sigh. It seems a little crummy to cut and paste lstat64.c to stat64.c but then adding an "-L" option to lstat64 to -not- stat the link seems all bass-ackwards. We need something like this, but I'm open to suggestions of a better implementation. Even /usr/bin/stat -l may suffice, I don't know why we roll our own lstat64 binary. Signed-off-by: Eric Sandeen --- diff --git a/common.rc b/common.rc index 6bf1e12..57b28c6 100644 --- a/common.rc +++ b/common.rc @@ -584,7 +584,7 @@ _is_block_dev() exit 1 fi - [ -b $1 ] && src/lstat64 $1 | $AWK_PROG '/Device type:/ { print $9 }' + [ -b $1 ] && src/stat64 $1 | $AWK_PROG '/Device type:/ { print $9 }' } # Do a command, log it to $seq.full, optionally test return status diff --git a/src/Makefile b/src/Makefile index 976133d..1144547 100644 --- a/src/Makefile +++ b/src/Makefile @@ -5,7 +5,7 @@ TOPDIR = .. include $(TOPDIR)/include/builddefs -TARGETS = dirstress fill fill2 getpagesize holes lstat64 \ +TARGETS = dirstress fill fill2 getpagesize holes stat64 lstat64 \ nametest permname randholes runas truncfile usemem \ mmapcat append_reader append_writer dirperf metaperf \ devzero feature alloc fault fstest t_access_root \ diff --git a/src/stat64.c b/src/stat64.c new file mode 100644 index 0000000..3b68c66 --- /dev/null +++ b/src/stat64.c @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2000-2002 Silicon Graphics, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include + +long timebuf; + +void +timesince(long timesec) +{ + long d_since; /* days */ + long h_since; /* hours */ + long m_since; /* minutes */ + long s_since; /* seconds */ + + s_since = timebuf - timesec; + d_since = s_since / 86400l ; + s_since -= d_since * 86400l ; + h_since = s_since / 3600l ; + s_since -= h_since * 3600l ; + m_since = s_since / 60l ; + s_since -= m_since * 60l ; + + printf("(%05ld.%02ld:%02ld:%02ld)\n", + d_since, h_since, m_since, s_since); +} + +void +usage(void) +{ + fprintf(stderr, "Usage: lstat64 [-t] filename ...\n"); + exit(1); +} + +int +main(int argc, char **argv) +{ + struct stat64 sbuf; + int i, c; + int terse_flag = 0; + + while ((c = getopt(argc, argv, "t")) != EOF) { + switch (c) { + case 't': + terse_flag = 1; + break; + + case '?': + usage(); + } + } + if (optind == argc) { + usage(); + } + + time(&timebuf); + + for (i = optind; i < argc; i++) { + char mode[] = "----------"; + + if( lstat64(argv[i], &sbuf) < 0) { + perror(argv[i]); + continue; + } + + if (terse_flag) { + printf("%s %llu ", argv[i], (unsigned long long)sbuf.st_size); + } + else { + printf(" File: \"%s\"\n", argv[i]); + printf(" Size: %-10llu", (unsigned long long)sbuf.st_size); + } + + if (sbuf.st_mode & (S_IEXEC>>6)) + mode[9] = 'x'; + if (sbuf.st_mode & (S_IWRITE>>6)) + mode[8] = 'w'; + if (sbuf.st_mode & (S_IREAD>>6)) + mode[7] = 'r'; + if (sbuf.st_mode & (S_IEXEC>>3)) + mode[6] = 'x'; + if (sbuf.st_mode & (S_IWRITE>>3)) + mode[5] = 'w'; + if (sbuf.st_mode & (S_IREAD>>3)) + mode[4] = 'r'; + if (sbuf.st_mode & S_IEXEC) + mode[3] = 'x'; + if (sbuf.st_mode & S_IWRITE) + mode[2] = 'w'; + if (sbuf.st_mode & S_IREAD) + mode[1] = 'r'; + if (sbuf.st_mode & S_ISVTX) + mode[9] = 't'; + if (sbuf.st_mode & S_ISGID) + mode[6] = 's'; + if (sbuf.st_mode & S_ISUID) + mode[3] = 's'; + + if (!terse_flag) + printf(" Filetype: "); + switch (sbuf.st_mode & S_IFMT) { + case S_IFSOCK: + if (!terse_flag) + puts("Socket"); + mode[0] = 's'; + break; + case S_IFDIR: + if (!terse_flag) + puts("Directory"); + mode[0] = 'd'; + break; + case S_IFCHR: + if (!terse_flag) + puts("Character Device"); + mode[0] = 'c'; + break; + case S_IFBLK: + if (!terse_flag) + puts("Block Device"); + mode[0] = 'b'; + break; + case S_IFREG: + if (!terse_flag) + puts("Regular File"); + mode[0] = '-'; + break; + case S_IFLNK: + if (!terse_flag) + puts("Symbolic Link"); + mode[0] = 'l'; + break; + case S_IFIFO: + if (!terse_flag) + puts("Fifo File"); + mode[0] = 'f'; + break; + default: + if (!terse_flag) + puts("Unknown"); + mode[0] = '?'; + } + + if (terse_flag) { + printf("%s %d,%d\n", mode, (int)sbuf.st_uid, (int)sbuf.st_gid); + continue; + } + + printf(" Mode: (%04o/%s)", (unsigned int)(sbuf.st_mode & 07777), mode); + printf(" Uid: (%d)", (int)sbuf.st_uid); + printf(" Gid: (%d)\n", (int)sbuf.st_gid); + printf("Device: %2d,%-2d", major(sbuf.st_dev), + minor(sbuf.st_dev)); + printf(" Inode: %-9llu", (unsigned long long)sbuf.st_ino); + printf(" Links: %-5ld", (long)sbuf.st_nlink); + + if ( ((sbuf.st_mode & S_IFMT) == S_IFCHR) + || ((sbuf.st_mode & S_IFMT) == S_IFBLK) ) + printf(" Device type: %2d,%-2d\n", + major(sbuf.st_rdev), minor(sbuf.st_rdev)); + else + printf("\n"); + + printf("Access: %.24s",ctime(&sbuf.st_atime)); + timesince(sbuf.st_atime); + printf("Modify: %.24s",ctime(&sbuf.st_mtime)); + timesince(sbuf.st_mtime); + printf("Change: %.24s",ctime(&sbuf.st_ctime)); + timesince(sbuf.st_ctime); + + if (i+1 < argc) + printf("\n"); + } + exit(0); +} From sandeen@sandeen.net Fri Jun 4 12:34:30 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_64,T_FRT_LOLITA1 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o54HYUtr236403 for ; Fri, 4 Jun 2010 12:34:30 -0500 X-ASG-Debug-ID: 1275673018-3e9b00930000-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 48A8D14885EF for ; Fri, 4 Jun 2010 10:36:58 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id aVngRELtBKJUUsQC for ; Fri, 04 Jun 2010 10:36:58 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id D58F348BC888 for ; Fri, 4 Jun 2010 12:36:57 -0500 (CDT) Message-ID: <4C0939B9.9000109@sandeen.net> Date: Fri, 04 Jun 2010 12:36:57 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: [PATCH V2] xfstests: use stat not lstat when examining devices Subject: [PATCH V2] xfstests: use stat not lstat when examining devices References: <4C091B4E.5030503@sandeen.net> In-Reply-To: <4C091B4E.5030503@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: 1275673019 X-Barracuda-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.31622 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 If you try running xfstests on lvm volumes which are symlinks, it'll fail to run several tests because our _require_scratch framework ultimately uses lstat not stat, and does not think the lvm device (which is usually a symlink to a dm-X device) is a block device. Sigh. Adding a -l option to lstat64 in order to call stat not lstat, and stat the target of the link, should be a simple fix. Signed-off-by: Eric Sandeen --- diff --git a/common.rc b/common.rc index 6bf1e12..3539a43 100644 --- a/common.rc +++ b/common.rc @@ -584,7 +584,7 @@ _is_block_dev() exit 1 fi - [ -b $1 ] && src/lstat64 $1 | $AWK_PROG '/Device type:/ { print $9 }' + [ -b $1 ] && src/lstat64 -l $1 | $AWK_PROG '/Device type:/ { print $9 }' } # Do a command, log it to $seq.full, optionally test return status diff --git a/src/lstat64.c b/src/lstat64.c index 3b68c66..c7c7106 100644 --- a/src/lstat64.c +++ b/src/lstat64.c @@ -49,7 +49,7 @@ timesince(long timesec) void usage(void) { - fprintf(stderr, "Usage: lstat64 [-t] filename ...\n"); + fprintf(stderr, "Usage: lstat64 [-tl] filename ...\n"); exit(1); } @@ -59,13 +59,18 @@ main(int argc, char **argv) struct stat64 sbuf; int i, c; int terse_flag = 0; + int follow_flag = 0; - while ((c = getopt(argc, argv, "t")) != EOF) { + while ((c = getopt(argc, argv, "tl")) != EOF) { switch (c) { case 't': terse_flag = 1; break; + case 'l': + follow_flag = 1; + break; + case '?': usage(); } @@ -79,7 +84,10 @@ main(int argc, char **argv) for (i = optind; i < argc; i++) { char mode[] = "----------"; - if( lstat64(argv[i], &sbuf) < 0) { + if (!follow_flag && lstat64(argv[i], &sbuf) < 0) { + perror(argv[i]); + continue; + } else if (follow_flag && stat64(argv[i], &sbuf) < 0) { perror(argv[i]); continue; } From sandeen@sandeen.net Fri Jun 4 12:57:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_FRT_LOLITA1 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o54HvYxb237525 for ; Fri, 4 Jun 2010 12:57:35 -0500 X-ASG-Debug-ID: 1275674402-27e702260000-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 50B2A398CD8 for ; Fri, 4 Jun 2010 11:00:02 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id MOeCW2VfnX1Ps14q for ; Fri, 04 Jun 2010 11:00:02 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 648204817DE0 for ; Fri, 4 Jun 2010 13:00:02 -0500 (CDT) Message-ID: <4C093F22.1010006@sandeen.net> Date: Fri, 04 Jun 2010 13:00:02 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: [PATCH V3] xfstests: use stat not lstat when examining devices Subject: [PATCH V3] xfstests: use stat not lstat when examining devices References: <4C091B4E.5030503@sandeen.net> <4C0939B9.9000109@sandeen.net> In-Reply-To: <4C0939B9.9000109@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: 1275674403 X-Barracuda-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.31624 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 If you try running xfstests on lvm volumes which are symlinks, it'll fail to run several tests because our _require_scratch framework ultimately uses lstat not stat, and does not think the lvm device (which is usually a symlink to a dm-X device) is a block device. Sigh. Just calling stat(1) with -L to follow the link should suffice. Signed-off-by: Eric Sandeen --- diff --git a/common.rc b/common.rc index 6bf1e12..db18884 100644 --- a/common.rc +++ b/common.rc @@ -584,7 +584,7 @@ _is_block_dev() exit 1 fi - [ -b $1 ] && src/lstat64 $1 | $AWK_PROG '/Device type:/ { print $9 }' + [ -b $1 ] && stat -L $1 | $AWK_PROG '/Device type:/ { print $9 }' } # Do a command, log it to $seq.full, optionally test return status From aelder@sgi.com Fri Jun 4 13:25:27 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_FRT_LOLITA1 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o54IPQaF238694 for ; Fri, 4 Jun 2010 13:25:26 -0500 Received: from cf--amer001e--3.americas.sgi.com (cf--amer001e--3.americas.sgi.com [137.38.100.5]) by relay3.corp.sgi.com (Postfix) with ESMTP id 38BFBAC00C; Fri, 4 Jun 2010 11:27:52 -0700 (PDT) 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, 4 Jun 2010 13:26:53 -0500 Subject: Re: [PATCH V3] xfstests: use stat not lstat when examining devices From: Alex Elder Reply-To: aelder@sgi.com To: Eric Sandeen Cc: xfs-oss In-Reply-To: <4C093F22.1010006@sandeen.net> References: <4C091B4E.5030503@sandeen.net> <4C0939B9.9000109@sandeen.net> <4C093F22.1010006@sandeen.net> Content-Type: text/plain; charset="UTF-8" Date: Fri, 04 Jun 2010 13:26:50 -0500 Message-ID: <1275676010.2317.53.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 04 Jun 2010 18:26:53.0353 (UTC) FILETIME=[817CF190:01CB0413] 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-06-04 at 13:00 -0500, Eric Sandeen wrote: > If you try running xfstests on lvm volumes which are symlinks, > it'll fail to run several tests because our _require_scratch > framework ultimately uses lstat not stat, and does not think > the lvm device (which is usually a symlink to a dm-X device) > is a block device. Sigh. > > Just calling stat(1) with -L to follow the link should > suffice. I wonder whether we'll find stat(1) output ever varies enough to affect this. But otherwise this looks good to me. Reviewed-by: Alex Elder > Signed-off-by: Eric Sandeen > --- > > diff --git a/common.rc b/common.rc > index 6bf1e12..db18884 100644 > --- a/common.rc > +++ b/common.rc > @@ -584,7 +584,7 @@ _is_block_dev() > exit 1 > fi > > - [ -b $1 ] && src/lstat64 $1 | $AWK_PROG '/Device type:/ { print $9 }' > + [ -b $1 ] && stat -L $1 | $AWK_PROG '/Device type:/ { print $9 }' > } > > # Do a command, log it to $seq.full, optionally test return status > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From aelder@oss.sgi.com Fri Jun 4 15:30:43 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o54KUhcr244849 for ; Fri, 4 Jun 2010 15:30:43 -0500 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o54KUhrA244811; Fri, 4 Jun 2010 15:30:43 -0500 Date: Fri, 4 Jun 2010 15:30:43 -0500 Message-Id: <201006042030.o54KUhrA244811@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v2.6.34-81-gf936972 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: fb3b504adeee942e55393396fea8fdf406acf037 X-Git-Newrev: f9369729496a0f4c607a4cc1ea4dfeddbbfc505a 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 f936972 xfs: improve xfs_isilocked 070ecdc xfs: skip writeback from reclaim context 5b257b4 xfs: fix race in inode cluster freeing failing to stale inodes from fb3b504adeee942e55393396fea8fdf406acf037 (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 f9369729496a0f4c607a4cc1ea4dfeddbbfc505a Author: Christoph Hellwig Date: Thu Jun 3 16:22:29 2010 +1000 xfs: improve xfs_isilocked Use rwsem_is_locked to make the assertations for shared locks work. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit 070ecdca54dde9577d2697088e74e45568f48efb Author: Christoph Hellwig Date: Thu Jun 3 16:22:29 2010 +1000 xfs: skip writeback from reclaim context Allowing writeback from reclaim context causes massive problems with stack overflows as we can call into the writeback code which tends to be a heavy stack user both in the generic code and XFS from random contexts that perform memory allocations. Follow the example of btrfs (and in slightly different form ext4) and refuse to write out data from reclaim context. This issue should really be handled by the VM so that we can tune better for this case, but until we get it sorted out there we have to hack around this in each filesystem with a complex writeback path. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner commit 5b257b4a1f9239624c6b5e669763de04e482c2b3 Author: Dave Chinner Date: Thu Jun 3 16:22:29 2010 +1000 xfs: fix race in inode cluster freeing failing to stale inodes When an inode cluster is freed, it needs to mark all inodes in memory as XFS_ISTALE before marking the buffer as stale. This is eeded because the inodes have a different life cycle to the buffer, and once the buffer is torn down during transaction completion, we must ensure none of the inodes get written back (which is what XFS_ISTALE does). Unfortunately, xfs_ifree_cluster() has some bugs that lead to inodes not being marked with XFS_ISTALE. This shows up when xfs_iflush() is called on these inodes either during inode reclaim or tail pushing on the AIL. The buffer is read back, but no longer contains inodes and so triggers assert failures and shutdowns. This was reproducable with at run.dbench10 invocation from xfstests. There are two main causes of xfs_ifree_cluster() failing. The first is simple - it checks in-memory inodes it finds in the per-ag icache to see if they are clean without holding the flush lock. if they are clean it skips them completely. However, If an inode is flushed delwri, it will appear clean, but is not guaranteed to be written back until the flush lock has been dropped. Hence we may have raced on the clean check and the inode may actually be dirty. Hence always mark inodes found in memory stale before we check properly if they are clean. The second is more complex, and makes the first problem easier to hit. Basically the in-memory inode scan is done with full knowledge it can be racing with inode flushing and AIl tail pushing, which means that inodes that it can't get the flush lock on might not be attached to the buffer after then in-memory inode scan due to IO completion occurring. This is actually documented in the code as "needs better interlocking". i.e. this is a zero-day bug. Effectively, the in-memory scan must be done while the inode buffer is locked and Io cannot be issued on it while we do the in-memory inode scan. This ensures that inodes we couldn't get the flush lock on are guaranteed to be attached to the cluster buffer, so we can then catch all in-memory inodes and mark them stale. Now that the inode cluster buffer is locked before the in-memory scan is done, there is no need for the two-phase update of the in-memory inodes, so simplify the code into two loops and remove the allocation of the temporary buffer used to hold locked inodes across the phases. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig ----------------------------------------------------------------------- Summary of changes: fs/xfs/linux-2.6/xfs_aops.c | 15 +++++ fs/xfs/xfs_iget.c | 26 +++----- fs/xfs/xfs_inode.c | 142 +++++++++++++++++++------------------------ 3 files changed, 87 insertions(+), 96 deletions(-) hooks/post-receive -- XFS development tree From aelder@oss.sgi.com Sat Jun 5 06:10:43 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o55BAhdg022580 for ; Sat, 5 Jun 2010 06:10:43 -0500 Received: (from aelder@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id o55BAdUa022475; Sat, 5 Jun 2010 06:10:39 -0500 Date: Sat, 5 Jun 2010 06:10:39 -0500 Message-Id: <201006051110.o55BAdUa022475@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-linus, updated. v2.6.34-8881-g1bf7dbf X-Git-Refname: refs/heads/for-linus X-Git-Reftype: branch X-Git-Oldrev: 88e88374ee4958786397a57f684de6f1fc5e0242 X-Git-Newrev: 1bf7dbfde8fe7ddaa8e2e1b4e0fc41a9fc6aa7a5 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 1bf7dbf Merge branch 'master' into for-linus f936972 xfs: improve xfs_isilocked 070ecdc xfs: skip writeback from reclaim context 5b257b4 xfs: fix race in inode cluster freeing failing to stale inodes fb3b504 xfs: fix access to upper inodes without inode64 9b98b6f xfs: fix might_sleep() warning when initialising per-ag tree 38e712a fs/xfs/quota: Add missing mutex_unlock 3bd0946 xfs: remove duplicated #include f8adb4d xfs: convert more trace events to DEFINE_EVENT 292ec4c xfs: xfs_trace.c: remove duplicated #include 07f1a4f xfs: Check new inode size is OK before preallocating fdc07f4 xfs: clean up xlog_align 025101d xfs: cleanup log reservation calculactions 32891b2 xfs: be more explicit if RT mount fails due to config 657a4cf xfs: replace E2BIG with EFBIG where appropriate 7ea8085 drop unused dentry argument to ->fsync from 88e88374ee4958786397a57f684de6f1fc5e0242 (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 1bf7dbfde8fe7ddaa8e2e1b4e0fc41a9fc6aa7a5 Merge: ad8456361fa19068cf49b50a4f98e41b73c08e76 f9369729496a0f4c607a4cc1ea4dfeddbbfc505a Author: Alex Elder Date: Fri Jun 4 13:22:30 2010 -0500 Merge branch 'master' into for-linus commit 7ea8085910ef3dd4f3cad6845aaa2b580d39b115 Author: Christoph Hellwig Date: Wed May 26 17:53:25 2010 +0200 drop unused dentry argument to ->fsync Signed-off-by: Christoph Hellwig Signed-off-by: Al Viro ----------------------------------------------------------------------- Summary of changes: fs/xfs/linux-2.6/xfs_aops.c | 15 ++ fs/xfs/linux-2.6/xfs_file.c | 10 +- fs/xfs/linux-2.6/xfs_iops.c | 16 ++- fs/xfs/linux-2.6/xfs_quotaops.c | 1 - fs/xfs/linux-2.6/xfs_sync.c | 9 - fs/xfs/linux-2.6/xfs_trace.c | 1 - fs/xfs/linux-2.6/xfs_trace.h | 356 ++++++++++++++++--------------- fs/xfs/quota/xfs_qm.c | 4 +- fs/xfs/xfs_ag.h | 1 - fs/xfs/xfs_iget.c | 29 +-- fs/xfs/xfs_inode.c | 144 ++++++------- fs/xfs/xfs_log_recover.c | 11 +- fs/xfs/xfs_mount.c | 68 +++---- fs/xfs/xfs_rtalloc.c | 4 +- fs/xfs/xfs_rtalloc.h | 11 +- fs/xfs/xfs_trans.c | 446 +++++++++++++++++++++++++++++++++++---- fs/xfs/xfs_trans.h | 411 ------------------------------------ fs/xfs/xfs_vnodeops.c | 2 +- 18 files changed, 741 insertions(+), 798 deletions(-) hooks/post-receive -- XFS development tree From aelder@sgi.com Sat Jun 5 06:14:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (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 o55BEiIf022833 for ; Sat, 5 Jun 2010 06:14:44 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay1.corp.sgi.com (Postfix) with ESMTP id 992F38F8054; Sat, 5 Jun 2010 04:17:11 -0700 (PDT) Received: from stout.americas.sgi.com (localhost6.localdomain6 [127.0.0.1]) by stout.americas.sgi.com (8.14.3/8.14.2) with ESMTP id o55BHAwl006255; Sat, 5 Jun 2010 06:17:10 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o55BH8KB006254; Sat, 5 Jun 2010 06:17:08 -0500 From: Alex Elder Message-Id: <201006051117.o55BH8KB006254@stout.americas.sgi.com> Date: Sat, 05 Jun 2010 06:17:07 -0500 To: torvalds@linux-foundation.org Subject: [GIT PULL] XFS update for 2.6.35-rc2 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 The following changes since commit 7f0d384cafabfbb56663ee6944c18fc0450fc5d6: Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6 (2010-06-04 21:12:39 -0700) are available in the git repository at: git://oss.sgi.com/xfs/xfs for-linus Alex Elder (1): Merge branch 'master' into for-linus Christoph Hellwig (6): xfs: cleanup log reservation calculactions xfs: clean up xlog_align xfs: fix access to upper inodes without inode64 xfs: remove done roadmap item from xfs-delayed-logging-design.txt xfs: skip writeback from reclaim context xfs: improve xfs_isilocked Dave Chinner (3): xfs: Check new inode size is OK before preallocating xfs: fix might_sleep() warning when initialising per-ag tree xfs: fix race in inode cluster freeing failing to stale inodes Eric Sandeen (2): xfs: replace E2BIG with EFBIG where appropriate xfs: be more explicit if RT mount fails due to config Huang Weiyi (2): xfs: xfs_trace.c: remove duplicated #include xfs: remove duplicated #include Julia Lawall (1): fs/xfs/quota: Add missing mutex_unlock Li Zefan (1): xfs: convert more trace events to DEFINE_EVENT .../filesystems/xfs-delayed-logging-design.txt | 5 - fs/xfs/linux-2.6/xfs_aops.c | 15 + fs/xfs/linux-2.6/xfs_iops.c | 16 +- fs/xfs/linux-2.6/xfs_quotaops.c | 1 - fs/xfs/linux-2.6/xfs_sync.c | 9 - fs/xfs/linux-2.6/xfs_trace.c | 1 - fs/xfs/linux-2.6/xfs_trace.h | 356 ++++++++-------- fs/xfs/quota/xfs_qm.c | 4 +- fs/xfs/xfs_ag.h | 1 - fs/xfs/xfs_iget.c | 29 +- fs/xfs/xfs_inode.c | 144 +++---- fs/xfs/xfs_log_recover.c | 11 +- fs/xfs/xfs_mount.c | 68 ++-- fs/xfs/xfs_rtalloc.c | 4 +- fs/xfs/xfs_rtalloc.h | 11 +- fs/xfs/xfs_trans.c | 446 ++++++++++++++++++-- fs/xfs/xfs_trans.h | 411 ------------------ fs/xfs/xfs_vnodeops.c | 2 +- 18 files changed, 736 insertions(+), 798 deletions(-) From MAILER-DAEMON@oss.sgi.com Mon Jun 7 00:57:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o575vccn124328 for ; Mon, 7 Jun 2010 00:57:38 -0500 X-ASG-Debug-ID: 1275890408-1cfc03c00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from rcsinet11.oracle.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 119C5149726F for ; Sun, 6 Jun 2010 23:00:08 -0700 (PDT) Received: from rcsinet11.oracle.com (rcsinet11.oracle.com [148.87.113.123]) by cuda.sgi.com with ESMTP id T6UIu7FyxYZhvK61 for ; Sun, 06 Jun 2010 23:00:08 -0700 (PDT) Received: from oracle.com (localhost [127.0.0.1]) by rcsinet11.oracle.com (Switch-3.4.2/Switch-3.4.2) with ESMTP id o576067A006081 for ; Mon, 7 Jun 2010 06:00:07 GMT Message-Id: <1517568223.1275890399274@ace.smi> Date: Mon, 7 Jun 2010 05:59:59 +0000 From: no-reply@oracle.com To: xfs@oss.sgi.com X-ASG-Orig-Subj: Email attachment rejected Subject: Email attachment rejected MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Priority: 3 Importance: Normal X-Barracuda-Connect: rcsinet11.oracle.com[148.87.113.123] X-Barracuda-Start-Time: 1275890409 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2433 1.0000 -0.6077 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.61 X-Barracuda-Spam-Status: No, SCORE=-0.61 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31858 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Oracle does not allow messages with executable message attachments. From SRS0+R53I+8+fromorbit.com=david@internode.on.net Mon Jun 7 19:08:53 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5808rBM178560 for ; Mon, 7 Jun 2010 19:08:53 -0500 X-ASG-Debug-ID: 1275955883-5c4d018a0000-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 095D13A0417 for ; Mon, 7 Jun 2010 17:11:23 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id WcSzrfBEs5ZovLtV for ; Mon, 07 Jun 2010 17:11:23 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27072309-1927428 for multiple; Tue, 08 Jun 2010 09:41:17 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OLmPT-0001uI-NM; Tue, 08 Jun 2010 10:11:15 +1000 Date: Tue, 8 Jun 2010 10:11:15 +1000 From: Dave Chinner To: Christoph Hellwig Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: Re: [PATCH 0/6] writeback: tracing and fixes V3. Subject: Re: [PATCH 0/6] writeback: tracing and fixes V3. Message-ID: <20100608001115.GB6965@dastard> References: <1275609328-12514-1-git-send-email-david@fromorbit.com> <20100604074938.GB4448@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100604074938.GB4448@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1275955885 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31918 Rule breakdown below pts rule 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, Jun 04, 2010 at 03:49:38AM -0400, Christoph Hellwig wrote: > > Not sure what the rules for new tracepoints are, but in addition to the > fixes I'd really love to see the tracepoints in 2.6.35. Personally I think they are just as important (or even more important) than the bug fixes because we seem to break this code regularly because nobody can clearly see what the internals are doing to verify their change is working correctly. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+zsqh+8+fromorbit.com=dave@internode.on.net Mon Jun 7 19:36:29 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o580aSX2179682 for ; Mon, 7 Jun 2010 19:36:29 -0500 X-ASG-Debug-ID: 1275957711-6e5202c20000-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 EE8AA158C5AF for ; Mon, 7 Jun 2010 17:41:51 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id PpTRwz4GYXl0fPZB for ; Mon, 07 Jun 2010 17:41:51 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 15506848-1927428 for multiple; Tue, 08 Jun 2010 10:08:21 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OLmpf-0001wL-MV; Tue, 08 Jun 2010 10:38:19 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OLmpb-0006Ar-UU; Tue, 08 Jun 2010 10:38:15 +1000 From: Dave Chinner To: torvalds@linux-foundation.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: [PATCH 3/6] writeback: Add tracing to write_cache_pages Subject: [PATCH 3/6] writeback: Add tracing to write_cache_pages Date: Tue, 8 Jun 2010 10:38:04 +1000 Message-Id: <1275957487-23633-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1275957487-23633-1-git-send-email-david@fromorbit.com> References: <1275957487-23633-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1275957712 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31921 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Add a trace event to the ->writepage loop in write_cache_pages to give visibility into how the ->writepage call is changing variables within the writeback control structure. Of most interest is how wbc->nr_to_write changes from call to call, especially with filesystems that write multiple pages in ->writepage. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- include/trace/events/writeback.h | 1 + mm/page-writeback.c | 1 + 2 files changed, 2 insertions(+), 0 deletions(-) diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h index 7867c16..6797c46 100644 --- a/include/trace/events/writeback.h +++ b/include/trace/events/writeback.h @@ -244,6 +244,7 @@ DEFINE_WBC_EVENT(wbc_writeback_wait); DEFINE_WBC_EVENT(wbc_balance_dirty_start); DEFINE_WBC_EVENT(wbc_balance_dirty_written); DEFINE_WBC_EVENT(wbc_balance_dirty_wait); +DEFINE_WBC_EVENT(wbc_writepage); #endif /* _TRACE_WRITEBACK_H */ diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 345a730..7ac39c5 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -921,6 +921,7 @@ continue_unlock: if (!clear_page_dirty_for_io(page)) goto continue_unlock; + trace_wbc_writepage(wbc); ret = (*writepage)(page, wbc, data); if (unlikely(ret)) { if (ret == AOP_WRITEPAGE_ACTIVATE) { -- 1.7.1 From SRS0+7p63+8+fromorbit.com=dave@internode.on.net Mon Jun 7 19:36:27 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_21 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o580aRGG179674 for ; Mon, 7 Jun 2010 19:36:27 -0500 X-ASG-Debug-ID: 1275957537-5c4902000000-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 265763A05EF for ; Mon, 7 Jun 2010 17:38:58 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id 2eShLUAb0g8XWOHE for ; Mon, 07 Jun 2010 17:38:58 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26943136-1927428 for multiple; Tue, 08 Jun 2010 10:08:21 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OLmpf-0001wH-H5; Tue, 08 Jun 2010 10:38:19 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OLmpb-0006Al-Of; Tue, 08 Jun 2010 10:38:15 +1000 From: Dave Chinner To: torvalds@linux-foundation.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: [PATCH 0/6] writeback: tracing and fixes V4 Subject: [PATCH 0/6] writeback: tracing and fixes V4 Date: Tue, 8 Jun 2010 10:38:01 +1000 Message-Id: <1275957487-23633-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1275957539 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31920 Rule breakdown below pts rule 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 Linus, Can you please consider this patch series for 2.6.35? If you don't want the tracing at this stage of the release process, I can redo the series with just the bug fixes. However, given the regularity with which we break the writeback code in subtle ways, the tracing is probably just as important as the bug fixes. --- This series contains the initial writeback tracing patches from Jens, as well as the extensions I added to provide visibility into writeback control structures as the are used by the writeback code. The visibility given is sufficient to understand what is happening in the writeback path - what path is writing data, what path is blocking on congestion, etc, and to determine the differences in behaviour for different sync modes and calling contexts. This tracing really needs to be integrated into mainline so that anyone can improve the tracing as they use it to track down problems in our convoluted writeback paths. The remaining patches are fixes to problems that the new tracing highlighted. Version 4: - converted strncpy to strlcpy - remove stale information from commit message for nr_to_write fixup. Version 3: - added comment to tracepoint creation to explain the unusual placement of the tracepoint header file include. - separated out ->writepage tracepoint addition into it's own patch. - dropped ext4 write_cache_pages separation as it is now in mainline. - removed ext4 tracing references to wbc->no_nrwrite_index_update as they weren't removed in mainline. - fixed commit message for write_cache_pages patch - added more information to commit message for sync hold-off fixup. Version 2: - included ext4 write_cache_pages separation patch from Ted Ts'o. - moved CREATE_TRACE_POINTS into fs-writeback.c as suggested by Christoph Hellwig. - moved include of trace/events/writeback.h until after structure definitions in fs-writeback.c - manually revert changes made to write_cache_pages() in 17bc6c30cf6bfffd816bdc53682dd46fc34a2cf4 that caused the regression. This restores the convention that if the fs writes back more than a single page, it subtracts (nr_written - 1) from wbc->nr_to_write, as suggested by Andrew Morton. - added patch to prevent sync from looping in write_cache_pages chasing a moving tail when an appending write workload is running concurrently with sync. --- fs/fs-writeback.c | 50 ++++++-- fs/xfs/linux-2.6/xfs_aops.c | 8 -- include/linux/writeback.h | 9 -- include/trace/events/ext4.h | 5 +- include/trace/events/writeback.h | 252 ++++++++++++++++++++++++++++++++++++++ mm/backing-dev.c | 3 + mm/page-writeback.c | 35 ++++-- 7 files changed, 321 insertions(+), 41 deletions(-) From SRS0+zsqh+8+fromorbit.com=dave@internode.on.net Mon Jun 7 19:36:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o580aRhn179676 for ; Mon, 7 Jun 2010 19:36:28 -0500 X-ASG-Debug-ID: 1275957709-386c00bf0000-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 73D1F158C5AF for ; Mon, 7 Jun 2010 17:41:50 -0700 (PDT) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id r8bCl3WB0PLAoCAg for ; Mon, 07 Jun 2010 17:41:50 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26984204-1927428 for multiple; Tue, 08 Jun 2010 10:08:21 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OLmpf-0001wK-MA; Tue, 08 Jun 2010 10:38:19 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OLmpb-0006Ap-Sb; Tue, 08 Jun 2010 10:38:15 +1000 From: Dave Chinner To: torvalds@linux-foundation.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: [PATCH 2/6] writeback: Add tracing to balance_dirty_pages Subject: [PATCH 2/6] writeback: Add tracing to balance_dirty_pages Date: Tue, 8 Jun 2010 10:38:03 +1000 Message-Id: <1275957487-23633-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1275957487-23633-1-git-send-email-david@fromorbit.com> References: <1275957487-23633-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1275957711 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31921 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Tracing high level background writeback events is good, but it doesn't give the entire picture. Add IO dispatched by foreground throttling to the writeback events. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/fs-writeback.c | 5 ++ include/trace/events/writeback.h | 80 ++++++++++++++++++++++++++++++++++++++ mm/page-writeback.c | 4 ++ 3 files changed, 89 insertions(+), 0 deletions(-) diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 0949dfd..6f777d6 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -807,7 +807,11 @@ static long wb_writeback(struct bdi_writeback *wb, wbc.more_io = 0; wbc.nr_to_write = MAX_WRITEBACK_PAGES; wbc.pages_skipped = 0; + + trace_wbc_writeback_start(&wbc); writeback_inodes_wb(wb, &wbc); + trace_wbc_writeback_written(&wbc); + args->nr_pages -= MAX_WRITEBACK_PAGES - wbc.nr_to_write; wrote += MAX_WRITEBACK_PAGES - wbc.nr_to_write; @@ -835,6 +839,7 @@ static long wb_writeback(struct bdi_writeback *wb, if (!list_empty(&wb->b_more_io)) { inode = list_entry(wb->b_more_io.prev, struct inode, i_list); + trace_wbc_writeback_wait(&wbc); inode_wait_for_writeback(inode); } spin_unlock(&inode_lock); diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h index 6f510fa..7867c16 100644 --- a/include/trace/events/writeback.h +++ b/include/trace/events/writeback.h @@ -7,6 +7,9 @@ #include #include +struct wb_writeback_args; +struct bdi_work; + TRACE_EVENT(writeback_queue, TP_PROTO(struct backing_dev_info *bdi, struct wb_writeback_args *args), @@ -165,6 +168,83 @@ TRACE_EVENT(writeback_bdi_register, TP_printk("%s: %s", __entry->name, __entry->start ? "registered" : "unregistered") ); + +/* pass flags explicitly */ +DECLARE_EVENT_CLASS(wbc_class, + TP_PROTO(struct writeback_control *wbc), + TP_ARGS(wbc), + TP_STRUCT__entry( + __field(unsigned int, wbc) + __array(char, name, 16) + __field(long, nr_to_write) + __field(long, pages_skipped) + __field(int, sb) + __field(int, sync_mode) + __field(int, nonblocking) + __field(int, encountered_congestion) + __field(int, for_kupdate) + __field(int, for_background) + __field(int, for_reclaim) + __field(int, range_cyclic) + __field(int, more_io) + __field(unsigned long, older_than_this) + __field(long, range_start) + __field(long, range_end) + ), + + TP_fast_assign( + char *__name = "(none)"; + + __entry->wbc = (unsigned long)wbc & 0xffff; + if (wbc->bdi) + strncpy(__entry->name, dev_name(wbc->bdi->dev), 16); + else + strncpy(__entry->name, __name, 16); + __entry->nr_to_write = wbc->nr_to_write; + __entry->pages_skipped = wbc->pages_skipped; + __entry->sb = !!wbc->sb; + __entry->sync_mode = wbc->sync_mode; + __entry->for_kupdate = wbc->for_kupdate; + __entry->for_background = wbc->for_background; + __entry->for_reclaim = wbc->for_reclaim; + __entry->range_cyclic = wbc->range_cyclic; + __entry->more_io = wbc->more_io; + __entry->older_than_this = wbc->older_than_this ? + *wbc->older_than_this : 0; + __entry->range_start = (long)wbc->range_start; + __entry->range_end = (long)wbc->range_end; + ), + + TP_printk("dev %s wbc=%x towrt=%ld skip=%ld sb=%d mode=%d kupd=%d " + "bgrd=%d reclm=%d cyclic=%d more=%d older=0x%lx " + "start=0x%lx end=0x%lx", + __entry->name, + __entry->wbc, + __entry->nr_to_write, + __entry->pages_skipped, + __entry->sb, + __entry->sync_mode, + __entry->for_kupdate, + __entry->for_background, + __entry->for_reclaim, + __entry->range_cyclic, + __entry->more_io, + __entry->older_than_this, + __entry->range_start, + __entry->range_end) +) + +#define DEFINE_WBC_EVENT(name) \ +DEFINE_EVENT(wbc_class, name, \ + TP_PROTO(struct writeback_control *wbc), \ + TP_ARGS(wbc)) +DEFINE_WBC_EVENT(wbc_writeback_start); +DEFINE_WBC_EVENT(wbc_writeback_written); +DEFINE_WBC_EVENT(wbc_writeback_wait); +DEFINE_WBC_EVENT(wbc_balance_dirty_start); +DEFINE_WBC_EVENT(wbc_balance_dirty_written); +DEFINE_WBC_EVENT(wbc_balance_dirty_wait); + #endif /* _TRACE_WRITEBACK_H */ /* This part must be outside protection */ diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 5fa63bd..345a730 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -34,6 +34,7 @@ #include #include #include +#include /* * After a CPU has dirtied this many pages, balance_dirty_pages_ratelimited @@ -536,11 +537,13 @@ static void balance_dirty_pages(struct address_space *mapping, * threshold otherwise wait until the disk writes catch * up. */ + trace_wbc_balance_dirty_start(&wbc); if (bdi_nr_reclaimable > bdi_thresh) { writeback_inodes_wbc(&wbc); pages_written += write_chunk - wbc.nr_to_write; get_dirty_limits(&background_thresh, &dirty_thresh, &bdi_thresh, bdi); + trace_wbc_balance_dirty_written(&wbc); } /* @@ -566,6 +569,7 @@ static void balance_dirty_pages(struct address_space *mapping, if (pages_written >= write_chunk) break; /* We've done our duty */ + trace_wbc_balance_dirty_wait(&wbc); __set_current_state(TASK_INTERRUPTIBLE); io_schedule_timeout(pause); -- 1.7.1 From SRS0+Ohgc+8+fromorbit.com=dave@internode.on.net Mon Jun 7 19:36:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_ATTENTION autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o580acf4179731 for ; Mon, 7 Jun 2010 19:36:38 -0500 X-ASG-Debug-ID: 1275957547-287b03010000-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 C14251D57632 for ; Mon, 7 Jun 2010 17:39:08 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id YlEtfoENHVIMiH3c for ; Mon, 07 Jun 2010 17:39:08 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27125554-1927428 for multiple; Tue, 08 Jun 2010 10:08:31 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OLmpp-0001wc-Rl; Tue, 08 Jun 2010 10:38:29 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OLmpc-0006Au-0t; Tue, 08 Jun 2010 10:38:16 +1000 From: Dave Chinner To: torvalds@linux-foundation.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: [PATCH 4/6] writeback: pay attention to wbc->nr_to_write in write_cache_pages Subject: [PATCH 4/6] writeback: pay attention to wbc->nr_to_write in write_cache_pages Date: Tue, 8 Jun 2010 10:38:05 +1000 Message-Id: <1275957487-23633-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1275957487-23633-1-git-send-email-david@fromorbit.com> References: <1275957487-23633-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1275957549 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31920 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner If a filesystem writes more than one page in ->writepage, write_cache_pages fails to notice this and continues to attempt writeback when wbc->nr_to_write has gone negative - this trace was captured from XFS: wbc_writeback_start: towrt=1024 wbc_writepage: towrt=1024 wbc_writepage: towrt=0 wbc_writepage: towrt=-1 wbc_writepage: towrt=-5 wbc_writepage: towrt=-21 wbc_writepage: towrt=-85 This has adverse effects on filesystem writeback behaviour. write_cache_pages() needs to terminate after a certain number of pages are written, not after a certain number of calls to ->writepage are made. This is a regression introduced by 17bc6c30cf6bfffd816bdc53682dd46fc34a2cf4 ("vfs: Add no_nrwrite_index_update writeback control flag"), but cannot be reverted directly due to subsequent bug fixes that have gone in on top of it. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- include/linux/writeback.h | 9 --------- include/trace/events/ext4.h | 5 +---- mm/page-writeback.c | 15 +++++---------- 3 files changed, 6 insertions(+), 23 deletions(-) diff --git a/include/linux/writeback.h b/include/linux/writeback.h index f641346..d63ef8f 100644 --- a/include/linux/writeback.h +++ b/include/linux/writeback.h @@ -56,15 +56,6 @@ struct writeback_control { unsigned for_reclaim:1; /* Invoked from the page allocator */ unsigned range_cyclic:1; /* range_start is cyclic */ unsigned more_io:1; /* more io to be dispatched */ - /* - * write_cache_pages() won't update wbc->nr_to_write and - * mapping->writeback_index if no_nrwrite_index_update - * is set. write_cache_pages() may write more than we - * requested and we want to make sure nr_to_write and - * writeback_index are updated in a consistent manner - * so we use a single control to update them - */ - unsigned no_nrwrite_index_update:1; }; /* diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index f5b1ba9..f3865c7 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h @@ -306,7 +306,6 @@ TRACE_EVENT(ext4_da_writepages_result, __field( int, pages_written ) __field( long, pages_skipped ) __field( char, more_io ) - __field( char, no_nrwrite_index_update ) __field( pgoff_t, writeback_index ) ), @@ -317,16 +316,14 @@ TRACE_EVENT(ext4_da_writepages_result, __entry->pages_written = pages_written; __entry->pages_skipped = wbc->pages_skipped; __entry->more_io = wbc->more_io; - __entry->no_nrwrite_index_update = wbc->no_nrwrite_index_update; __entry->writeback_index = inode->i_mapping->writeback_index; ), - TP_printk("dev %s ino %lu ret %d pages_written %d pages_skipped %ld more_io %d no_nrwrite_index_update %d writeback_index %lu", + TP_printk("dev %s ino %lu ret %d pages_written %d pages_skipped %ld more_io %d writeback_index %lu", jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, __entry->ret, __entry->pages_written, __entry->pages_skipped, __entry->more_io, - __entry->no_nrwrite_index_update, (unsigned long) __entry->writeback_index) ); diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 7ac39c5..0acadee 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -839,7 +839,6 @@ int write_cache_pages(struct address_space *mapping, pgoff_t done_index; int cycled; int range_whole = 0; - long nr_to_write = wbc->nr_to_write; pagevec_init(&pvec, 0); if (wbc->range_cyclic) { @@ -940,11 +939,10 @@ continue_unlock: done = 1; break; } - } + } - if (nr_to_write > 0) { - nr_to_write--; - if (nr_to_write == 0 && + if (wbc->nr_to_write > 0) { + if (--wbc->nr_to_write == 0 && wbc->sync_mode == WB_SYNC_NONE) { /* * We stop writing back only if we are @@ -975,11 +973,8 @@ continue_unlock: end = writeback_index - 1; goto retry; } - if (!wbc->no_nrwrite_index_update) { - if (wbc->range_cyclic || (range_whole && nr_to_write > 0)) - mapping->writeback_index = done_index; - wbc->nr_to_write = nr_to_write; - } + if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0)) + mapping->writeback_index = done_index; return ret; } -- 1.7.1 From SRS0+5mSt+8+fromorbit.com=dave@internode.on.net Mon Jun 7 19:36:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o580ac4b179733 for ; Mon, 7 Jun 2010 19:36:38 -0500 X-ASG-Debug-ID: 1275957548-3472025c0000-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 325071D57634 for ; Mon, 7 Jun 2010 17:39:08 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id CiwR2Tcza0dPudpl for ; Mon, 07 Jun 2010 17:39:08 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27221725-1927428 for multiple; Tue, 08 Jun 2010 10:08:31 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OLmpf-0001wV-UU; Tue, 08 Jun 2010 10:38:19 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OLmpc-0006Ay-6K; Tue, 08 Jun 2010 10:38:16 +1000 From: Dave Chinner To: torvalds@linux-foundation.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: [PATCH 5/6] xfs: remove nr_to_write writeback windup. Subject: [PATCH 5/6] xfs: remove nr_to_write writeback windup. Date: Tue, 8 Jun 2010 10:38:06 +1000 Message-Id: <1275957487-23633-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1275957487-23633-1-git-send-email-david@fromorbit.com> References: <1275957487-23633-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1275957550 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31920 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Now that the background flush code has been fixed, we shouldn't need to silently multiply the wbc->nr_to_write to get good writeback. Remove that code. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_aops.c | 8 -------- 1 files changed, 0 insertions(+), 8 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index a0fa3bf..34640d6 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c @@ -1381,14 +1381,6 @@ xfs_vm_writepage( if (!page_has_buffers(page)) create_empty_buffers(page, 1 << inode->i_blkbits, 0); - - /* - * VM calculation for nr_to_write seems off. Bump it way - * up, this gets simple streaming writes zippy again. - * To be reviewed again after Jens' writeback changes. - */ - wbc->nr_to_write *= 4; - /* * Convert delayed allocate, unwritten or unmapped space * to real space and flush out to disk. -- 1.7.1 From SRS0+UgXc+8+fromorbit.com=dave@internode.on.net Mon Jun 7 19:36:39 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o580adeo179741 for ; Mon, 7 Jun 2010 19:36:39 -0500 X-ASG-Debug-ID: 1275957549-5c7401e70000-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 B1DB33A05F4 for ; Mon, 7 Jun 2010 17:39:09 -0700 (PDT) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id LOTof8nEjmus1CE7 for ; Mon, 07 Jun 2010 17:39:09 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26980064-1927428 for multiple; Tue, 08 Jun 2010 10:08:31 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OLmpp-0001wd-Vo; Tue, 08 Jun 2010 10:38:30 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OLmpc-0006B1-8Y; Tue, 08 Jun 2010 10:38:16 +1000 From: Dave Chinner To: torvalds@linux-foundation.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: [PATCH 6/6] writeback: limit write_cache_pages integrity scanning to current EOF Subject: [PATCH 6/6] writeback: limit write_cache_pages integrity scanning to current EOF Date: Tue, 8 Jun 2010 10:38:07 +1000 Message-Id: <1275957487-23633-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1275957487-23633-1-git-send-email-david@fromorbit.com> References: <1275957487-23633-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1275957550 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31920 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner sync can currently take a really long time if a concurrent writer is extending a file. The problem is that the dirty pages on the address space grow in the same direction as write_cache_pages scans, so if the writer keeps ahead of writeback, the writeback will not terminate until the writer stops adding dirty pages. For a data integrity sync, we only need to write the pages dirty at the time we start the writeback, so we can stop scanning once we get to the page that was at the end of the file at the time the scan started. This will prevent operations like copying a large file preventing sync from completing as it will not write back pages that were dirtied after the sync was started. This does not impact the existing integrity guarantees, as any dirty page (old or new) within the EOF range at the start of the scan will still be captured. This patch will not prevent sync from blocking on large writes into holes. That requires more complex intervention while this patch only addresses the common append-case of this sync holdoff. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- mm/page-writeback.c | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-) diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 0acadee..1a361f0 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -855,7 +855,22 @@ int write_cache_pages(struct address_space *mapping, if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) range_whole = 1; cycled = 1; /* ignore range_cyclic tests */ + + /* + * If this is a data integrity sync, cap the writeback to the + * current end of file. Any extension to the file that occurs + * after this is a new write and we don't need to write those + * pages out to fulfil our data integrity requirements. If we + * try to write them out, we can get stuck in this scan until + * the concurrent writer stops adding dirty pages and extending + * EOF. + */ + if (wbc->sync_mode == WB_SYNC_ALL && + wbc->range_end == LLONG_MAX) { + end = i_size_read(mapping->host) >> PAGE_CACHE_SHIFT; + } } + retry: done_index = index; while (!done && (index <= end)) { -- 1.7.1 From SRS0+zsqh+8+fromorbit.com=dave@internode.on.net Mon Jun 7 19:36:42 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_44, J_CHICKENPOX_45 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o580afiX179774 for ; Mon, 7 Jun 2010 19:36:42 -0500 X-ASG-Debug-ID: 1275957723-575603e10000-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 8D526158C5B8 for ; Mon, 7 Jun 2010 17:42:03 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id byJMsoKd88AgwXXo for ; Mon, 07 Jun 2010 17:42:03 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27395569-1927428 for multiple; Tue, 08 Jun 2010 10:08:31 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OLmpp-0001wI-Hh; Tue, 08 Jun 2010 10:38:29 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OLmpb-0006An-Qc; Tue, 08 Jun 2010 10:38:15 +1000 From: Dave Chinner To: torvalds@linux-foundation.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: [PATCH 1/6] writeback: initial tracing support Subject: [PATCH 1/6] writeback: initial tracing support Date: Tue, 8 Jun 2010 10:38:02 +1000 Message-Id: <1275957487-23633-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1275957487-23633-1-git-send-email-david@fromorbit.com> References: <1275957487-23633-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1275957725 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31921 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: From: Jens Axboe Trace queue/sched/exec parts of the writeback loop. This provides insight into when and why flusher threads are scheduled to run. e.g a sync invocation leaves a trace like: sync-2798 [006] 611323.335713: writeback_queue: 253:16: pages=87879, sb=0, kupdate=0, range_cyclic=0 for_background=0 sync-2798 [006] 611323.335718: writeback_sched: work=37c0, task=task sync-2798 [006] 611323.335817: writeback_queue: 8:0: pages=92680, sb=1, kupdate=0, range_cyclic=-1 for_background=0 sync-2798 [006] 611323.335819: writeback_sched: work=35c0, task=task sync-2798 [006] 611323.335855: writeback_queue: 253:16: pages=92680, sb=1, kupdate=0, range_cyclic=-1 for_background=0 sync-2798 [006] 611323.335857: writeback_sched: work=36c0, task=task sync-2798 [006] 611323.335890: writeback_queue: 8:0: pages=9223372036854775807, sb=1, kupdate=0, range_cyclic=0 for_background=0 sync-2798 [006] 611323.335891: writeback_sched: work=fe58, task=task sync-2798 [006] 611323.377341: writeback_queue: 253:16: pages=9223372036854775807, sb=1, kupdate=0, range_cyclic=0 for_background=0 sync-2798 [006] 611323.377346: writeback_sched: work=fe58, task=task This also lays the foundation for adding more writeback tracing to provide deeper insight into the whole writeback path. Signed-off-by: Jens Axboe Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/fs-writeback.c | 45 ++++++++-- include/trace/events/writeback.h | 171 ++++++++++++++++++++++++++++++++++++++ mm/backing-dev.c | 3 + 3 files changed, 209 insertions(+), 10 deletions(-) create mode 100644 include/trace/events/writeback.h diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 1d1088f..0949dfd 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -26,15 +26,9 @@ #include #include #include +#include #include "internal.h" -#define inode_to_bdi(inode) ((inode)->i_mapping->backing_dev_info) - -/* - * We don't actually have pdflush, but this one is exported though /proc... - */ -int nr_pdflush_threads; - /* * Passed into wb_writeback(), essentially a subset of writeback_control */ @@ -62,6 +56,21 @@ struct bdi_work { unsigned long state; /* flag bits, see WS_* */ }; +/* + * Include the creation of the trace points after defining the bdi_work and + * wb_writeback_args structures so that the definitions remain local to this + * file. + */ +#define CREATE_TRACE_POINTS +#include + +#define inode_to_bdi(inode) ((inode)->i_mapping->backing_dev_info) + +/* + * We don't actually have pdflush, but this one is exported though /proc... + */ +int nr_pdflush_threads; + enum { WS_USED_B = 0, WS_ONSTACK_B, @@ -136,6 +145,8 @@ static void wb_work_complete(struct bdi_work *work) static void wb_clear_pending(struct bdi_writeback *wb, struct bdi_work *work) { + trace_writeback_clear(work); + /* * The caller has retrieved the work arguments from this work, * drop our reference. If this is the last ref, delete and free it @@ -171,12 +182,16 @@ static void bdi_queue_work(struct backing_dev_info *bdi, struct bdi_work *work) * If the default thread isn't there, make sure we add it. When * it gets created and wakes up, we'll run this work. */ - if (unlikely(list_empty_careful(&bdi->wb_list))) + if (unlikely(list_empty_careful(&bdi->wb_list))) { + trace_writeback_sched(bdi, work, "default"); wake_up_process(default_backing_dev_info.wb.task); - else { + } else { struct bdi_writeback *wb = &bdi->wb; + struct task_struct *task = wb->task; - if (wb->task) + trace_writeback_sched(bdi, work, task ? "task" : "notask"); + + if (task) wake_up_process(wb->task); } } @@ -203,6 +218,7 @@ static void bdi_alloc_queue_work(struct backing_dev_info *bdi, work = kmalloc(sizeof(*work), GFP_ATOMIC); if (work) { bdi_work_init(work, args); + trace_writeback_queue(bdi, args); bdi_queue_work(bdi, work); } else { struct bdi_writeback *wb = &bdi->wb; @@ -236,6 +252,7 @@ static void bdi_sync_writeback(struct backing_dev_info *bdi, bdi_work_init(&work, &args); work.state |= WS_ONSTACK; + trace_writeback_queue(bdi, &args); bdi_queue_work(bdi, &work); bdi_wait_on_work_clear(&work); } @@ -907,6 +924,8 @@ long wb_do_writeback(struct bdi_writeback *wb, int force_wait) if (force_wait) work->args.sync_mode = args.sync_mode = WB_SYNC_ALL; + trace_writeback_exec(work); + /* * If this isn't a data integrity operation, just notify * that we have seen this work and we are now starting it. @@ -942,9 +961,13 @@ int bdi_writeback_task(struct bdi_writeback *wb) unsigned long wait_jiffies = -1UL; long pages_written; + trace_writeback_thread_start(1); + while (!kthread_should_stop()) { pages_written = wb_do_writeback(wb, 0); + trace_writeback_pages_written(pages_written); + if (pages_written) last_active = jiffies; else if (wait_jiffies != -1UL) { @@ -974,6 +997,8 @@ int bdi_writeback_task(struct bdi_writeback *wb) try_to_freeze(); } + trace_writeback_thread_start(0); + return 0; } diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h new file mode 100644 index 0000000..6f510fa --- /dev/null +++ b/include/trace/events/writeback.h @@ -0,0 +1,171 @@ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM writeback + +#if !defined(_TRACE_WRITEBACK_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_WRITEBACK_H + +#include +#include + +TRACE_EVENT(writeback_queue, + + TP_PROTO(struct backing_dev_info *bdi, struct wb_writeback_args *args), + + TP_ARGS(bdi, args), + + TP_STRUCT__entry( + __array(char, name, 16) + __field(long, nr_pages) + __field(int, sb) + __field(int, sync_mode) + __field(int, for_kupdate) + __field(int, range_cyclic) + __field(int, for_background) + ), + + TP_fast_assign( + strlcpy(__entry->name, dev_name(bdi->dev), 16); + __entry->nr_pages = args->nr_pages; + __entry->sb = !!args->sb; + __entry->for_kupdate = args->for_kupdate; + __entry->range_cyclic = args->range_cyclic; + __entry->for_background = args->for_background; + ), + + TP_printk("%s: pages=%ld, sb=%d, kupdate=%d, range_cyclic=%d " + "for_background=%d", __entry->name, __entry->nr_pages, + __entry->sb, __entry->for_kupdate, + __entry->range_cyclic, __entry->for_background) +); + +TRACE_EVENT(writeback_sched, + + TP_PROTO(struct backing_dev_info *bdi, struct bdi_work *work, + const char *msg), + + TP_ARGS(bdi, work, msg), + + TP_STRUCT__entry( + __array(char, name, 16) + __field(unsigned int, work) + __array(char, task, 8) + ), + + TP_fast_assign( + strlcpy(__entry->name, dev_name(bdi->dev), 16); + __entry->work = (unsigned long) work & 0xffff; + snprintf(__entry->task, 8, "%s", msg); + ), + + TP_printk("work=%x, task=%s", __entry->work, __entry->task) +); + +TRACE_EVENT(writeback_exec, + + TP_PROTO(struct bdi_work *work), + + TP_ARGS(work), + + TP_STRUCT__entry( + __field(unsigned int, work) + __field(long, nr_pages) + __field(int, sb) + __field(int, sync_mode) + __field(int, for_kupdate) + __field(int, range_cyclic) + __field(int, for_background) + ), + + TP_fast_assign( + __entry->work = (unsigned long) work & 0xffff; + __entry->nr_pages = work->args.nr_pages; + __entry->sb = !!work->args.sb; + __entry->for_kupdate = work->args.for_kupdate; + __entry->range_cyclic = work->args.range_cyclic; + __entry->for_background = work->args.for_background; + + ), + + TP_printk("work=%x pages=%ld, sb=%d, kupdate=%d, range_cyclic=%d" + " for_background=%d", __entry->work, + __entry->nr_pages, __entry->sb, __entry->for_kupdate, + __entry->range_cyclic, __entry->for_background) +); + +TRACE_EVENT(writeback_clear, + + TP_PROTO(struct bdi_work *work), + + TP_ARGS(work), + + TP_STRUCT__entry( + __field(struct bdi_work *, work) + __field(int, refs) + ), + + TP_fast_assign( + __entry->work = work; + __entry->refs = atomic_read(&work->pending); + ), + + TP_printk("work=%p, refs=%d", __entry->work, __entry->refs) +); + +TRACE_EVENT(writeback_pages_written, + + TP_PROTO(long pages_written), + + TP_ARGS(pages_written), + + TP_STRUCT__entry( + __field(long, pages) + ), + + TP_fast_assign( + __entry->pages = pages_written; + ), + + TP_printk("%ld", __entry->pages) +); + + +TRACE_EVENT(writeback_thread_start, + + TP_PROTO(int start), + + TP_ARGS(start), + + TP_STRUCT__entry( + __field(int, start) + ), + + TP_fast_assign( + __entry->start = start; + ), + + TP_printk("%s", __entry->start ? "started" : "exited") +); + +TRACE_EVENT(writeback_bdi_register, + + TP_PROTO(const char *name, int start), + + TP_ARGS(name, start), + + TP_STRUCT__entry( + __array(char, name, 16) + __field(int, start) + ), + + TP_fast_assign( + strlcpy(__entry->name, name, 16); + __entry->start = start; + ), + + TP_printk("%s: %s", __entry->name, + __entry->start ? "registered" : "unregistered") +); +#endif /* _TRACE_WRITEBACK_H */ + +/* This part must be outside protection */ +#include diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 660a87a..1f7723b 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -10,6 +10,7 @@ #include #include #include +#include static atomic_long_t bdi_seq = ATOMIC_LONG_INIT(0); @@ -585,6 +586,7 @@ int bdi_register(struct backing_dev_info *bdi, struct device *parent, bdi_debug_register(bdi, dev_name(dev)); set_bit(BDI_registered, &bdi->state); + trace_writeback_bdi_register(dev_name(dev), 1); exit: return ret; } @@ -647,6 +649,7 @@ static void bdi_prune_sb(struct backing_dev_info *bdi) void bdi_unregister(struct backing_dev_info *bdi) { if (bdi->dev) { + trace_writeback_bdi_register(dev_name(bdi->dev), 0); bdi_prune_sb(bdi); if (!bdi_cap_flush_forker(bdi)) -- 1.7.1 From npiggin@suse.de Tue Jun 8 00:36:04 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o585a45h193784 for ; Tue, 8 Jun 2010 00:36:04 -0500 X-ASG-Debug-ID: 1275975514-3ca002780000-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 D91D6149EF2F for ; Mon, 7 Jun 2010 22:38:34 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id TlNWYwOugI5Xbv2W for ; Mon, 07 Jun 2010 22:38:34 -0700 (PDT) Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id D9DDB8655F; Tue, 8 Jun 2010 07:38:33 +0200 (CEST) Received: by laptop.local0.net (Postfix, from userid 1000) id 55FD129819; Tue, 8 Jun 2010 15:38:31 +1000 (EST) Date: Tue, 8 Jun 2010 15:38:31 +1000 From: Nick Piggin To: Dave Chinner Cc: torvalds@linux-foundation.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: Re: [PATCH 6/6] writeback: limit write_cache_pages integrity scanning to current EOF Subject: Re: [PATCH 6/6] writeback: limit write_cache_pages integrity scanning to current EOF Message-ID: <20100608053831.GR26335@laptop> References: <1275957487-23633-1-git-send-email-david@fromorbit.com> <1275957487-23633-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1275957487-23633-7-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1275975515 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31939 Rule breakdown below pts rule 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, Jun 08, 2010 at 10:38:07AM +1000, Dave Chinner wrote: > From: Dave Chinner > > sync can currently take a really long time if a concurrent writer is > extending a file. The problem is that the dirty pages on the address > space grow in the same direction as write_cache_pages scans, so if > the writer keeps ahead of writeback, the writeback will not > terminate until the writer stops adding dirty pages. > > For a data integrity sync, we only need to write the pages dirty at > the time we start the writeback, so we can stop scanning once we get > to the page that was at the end of the file at the time the scan > started. > > This will prevent operations like copying a large file preventing > sync from completing as it will not write back pages that were > dirtied after the sync was started. This does not impact the > existing integrity guarantees, as any dirty page (old or new) > within the EOF range at the start of the scan will still be > captured. > > This patch will not prevent sync from blocking on large writes into > holes. The writes don't have to be into holes to cause this starvation problem, do they? > That requires more complex intervention while this patch only > addresses the common append-case of this sync holdoff. Jan's tagging patch looks pretty good to me and isn't so complex. I think we should just take that. From npiggin@suse.de Tue Jun 8 00:41:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_ATTENTION autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o585f1tj193948 for ; Tue, 8 Jun 2010 00:41:01 -0500 X-ASG-Debug-ID: 1275975812-457503ac0000-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 74DD43A149F for ; Mon, 7 Jun 2010 22:43:32 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id woekTSMvkqTggbFG for ; Mon, 07 Jun 2010 22:43:32 -0700 (PDT) Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id 1A2E28655F; Tue, 8 Jun 2010 07:43:32 +0200 (CEST) Received: by laptop.local0.net (Postfix, from userid 1000) id 4A4CD29819; Tue, 8 Jun 2010 15:43:30 +1000 (EST) Date: Tue, 8 Jun 2010 15:43:30 +1000 From: Nick Piggin To: Dave Chinner Cc: torvalds@linux-foundation.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: Re: [PATCH 4/6] writeback: pay attention to wbc->nr_to_write in write_cache_pages Subject: Re: [PATCH 4/6] writeback: pay attention to wbc->nr_to_write in write_cache_pages Message-ID: <20100608054330.GS26335@laptop> References: <1275957487-23633-1-git-send-email-david@fromorbit.com> <1275957487-23633-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1275957487-23633-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1275975813 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31939 Rule breakdown below pts rule 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, Jun 08, 2010 at 10:38:05AM +1000, Dave Chinner wrote: > From: Dave Chinner > > If a filesystem writes more than one page in ->writepage, write_cache_pages > fails to notice this and continues to attempt writeback when wbc->nr_to_write > has gone negative - this trace was captured from XFS: > > > wbc_writeback_start: towrt=1024 > wbc_writepage: towrt=1024 > wbc_writepage: towrt=0 > wbc_writepage: towrt=-1 > wbc_writepage: towrt=-5 > wbc_writepage: towrt=-21 > wbc_writepage: towrt=-85 > > This has adverse effects on filesystem writeback behaviour. write_cache_pages() > needs to terminate after a certain number of pages are written, not after a > certain number of calls to ->writepage are made. This is a regression > introduced by 17bc6c30cf6bfffd816bdc53682dd46fc34a2cf4 ("vfs: Add > no_nrwrite_index_update writeback control flag"), but cannot be reverted > directly due to subsequent bug fixes that have gone in on top of it. > > Signed-off-by: Dave Chinner > Reviewed-by: Christoph Hellwig Acked-by: Nick Piggin From npiggin@suse.de Tue Jun 8 00:42:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o585gJXO193995 for ; Tue, 8 Jun 2010 00:42:19 -0500 X-ASG-Debug-ID: 1275975890-4214022d0000-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 4E9E9149F33A for ; Mon, 7 Jun 2010 22:44:51 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id 8Rsfvpq6nIsYi1jf for ; Mon, 07 Jun 2010 22:44:51 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id A10255362F; Tue, 8 Jun 2010 07:44:49 +0200 (CEST) Received: by laptop.local0.net (Postfix, from userid 1000) id A299229819; Tue, 8 Jun 2010 15:44:46 +1000 (EST) Date: Tue, 8 Jun 2010 15:44:46 +1000 From: Nick Piggin To: Dave Chinner Cc: torvalds@linux-foundation.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: Re: [PATCH 0/6] writeback: tracing and fixes V4 Subject: Re: [PATCH 0/6] writeback: tracing and fixes V4 Message-ID: <20100608054446.GT26335@laptop> References: <1275957487-23633-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1275957487-23633-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1275975891 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, Jun 08, 2010 at 10:38:01AM +1000, Dave Chinner wrote: > Hi Linus, > > Can you please consider this patch series for 2.6.35? If you don't > want the tracing at this stage of the release process, I can redo > the series with just the bug fixes. However, given the regularity > with which we break the writeback code in subtle ways, the tracing > is probably just as important as the bug fixes. Oh, I don't have a problem with your EOF fix being merged now, as Jan's patch isn't suitable for 2.6.35. From SRS0+nIwr+8+fromorbit.com=david@internode.on.net Tue Jun 8 01:57:03 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o586v2eC197078 for ; Tue, 8 Jun 2010 01:57:03 -0500 X-ASG-Debug-ID: 1275980372-136702070000-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 0F72C3A1513 for ; Mon, 7 Jun 2010 23:59:32 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id WiO6p7gDUFbCayxE for ; Mon, 07 Jun 2010 23:59:32 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 26997630-1927428 for multiple; Tue, 08 Jun 2010 16:29:24 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OLsmQ-0002Gu-U4; Tue, 08 Jun 2010 16:59:22 +1000 Date: Tue, 8 Jun 2010 16:59:22 +1000 From: Dave Chinner To: Nick Piggin Cc: torvalds@linux-foundation.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: Re: [PATCH 6/6] writeback: limit write_cache_pages integrity scanning to current EOF Subject: Re: [PATCH 6/6] writeback: limit write_cache_pages integrity scanning to current EOF Message-ID: <20100608065922.GA7869@dastard> References: <1275957487-23633-1-git-send-email-david@fromorbit.com> <1275957487-23633-7-git-send-email-david@fromorbit.com> <20100608053831.GR26335@laptop> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100608053831.GR26335@laptop> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1275980374 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31946 Rule breakdown below pts rule 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, Jun 08, 2010 at 03:38:31PM +1000, Nick Piggin wrote: > On Tue, Jun 08, 2010 at 10:38:07AM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > sync can currently take a really long time if a concurrent writer is > > extending a file. The problem is that the dirty pages on the address > > space grow in the same direction as write_cache_pages scans, so if > > the writer keeps ahead of writeback, the writeback will not > > terminate until the writer stops adding dirty pages. > > > > For a data integrity sync, we only need to write the pages dirty at > > the time we start the writeback, so we can stop scanning once we get > > to the page that was at the end of the file at the time the scan > > started. > > > > This will prevent operations like copying a large file preventing > > sync from completing as it will not write back pages that were > > dirtied after the sync was started. This does not impact the > > existing integrity guarantees, as any dirty page (old or new) > > within the EOF range at the start of the scan will still be > > captured. > > > > This patch will not prevent sync from blocking on large writes into > > holes. > > The writes don't have to be into holes to cause this starvation > problem, do they? No, they don't. > > That requires more complex intervention while this patch only > > addresses the common append-case of this sync holdoff. > > Jan's tagging patch looks pretty good to me and isn't so complex. > I think we should just take that. I don't care which one we take as long as it is actually tested by more than the submitter and we get everything in for 2.6.35... Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+c853dde7a93cc9944cf2+2480+infradead.org+hch@bombadil.srs.infradead.org Tue Jun 8 03:01:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o58813RA199580 for ; Tue, 8 Jun 2010 03:01:05 -0500 X-ASG-Debug-ID: 1275984388-08d000200000-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 340EA10C5853 for ; Tue, 8 Jun 2010 01:06:28 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id m3eGG6dOlKlrHYCN for ; Tue, 08 Jun 2010 01:06:28 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OLtmP-0006P5-Rh; Tue, 08 Jun 2010 08:03:27 +0000 Date: Tue, 8 Jun 2010 04:03:25 -0400 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: Re: [PATCH 0/6] writeback: tracing and fixes V3. Subject: Re: [PATCH 0/6] writeback: tracing and fixes V3. Message-ID: <20100608080324.GA3119@infradead.org> References: <1275609328-12514-1-git-send-email-david@fromorbit.com> <20100604074938.GB4448@infradead.org> <20100608001115.GB6965@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100608001115.GB6965@dastard> User-Agent: Mutt/1.5.20 (2009-08-17) 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: 1275984389 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, Jun 08, 2010 at 10:11:15AM +1000, Dave Chinner wrote: > On Fri, Jun 04, 2010 at 03:49:38AM -0400, Christoph Hellwig wrote: > > > > Not sure what the rules for new tracepoints are, but in addition to the > > fixes I'd really love to see the tracepoints in 2.6.35. > > Personally I think they are just as important (or even more > important) than the bug fixes because we seem to break this code > regularly because nobody can clearly see what the internals are > doing to verify their change is working correctly. Given that Linus is pretty strict about only taking regression fixes I'd rather get the regression fix in and miss out on the tracing until the next merge window then missing out on everything. From SRS0+R53I+8+fromorbit.com=david@internode.on.net Tue Jun 8 07:26:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o58CQsTH208087 for ; Tue, 8 Jun 2010 07:26:54 -0500 X-ASG-Debug-ID: 1276000163-09fd01400000-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 232A03A2460 for ; Tue, 8 Jun 2010 05:29:23 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id Vvu2E9DAbzs2XjTO for ; Tue, 08 Jun 2010 05:29:23 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 15593429-1927428 for multiple; Tue, 08 Jun 2010 21:59:21 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OLxvj-0002a6-PV; Tue, 08 Jun 2010 22:29:19 +1000 Date: Tue, 8 Jun 2010 22:29:19 +1000 From: Dave Chinner To: Michael Tokarev Cc: Linux-kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs, aacraid 2.6.27 => 2.6.32 results in 6 times slowdown Subject: Re: xfs, aacraid 2.6.27 => 2.6.32 results in 6 times slowdown Message-ID: <20100608122919.GC7869@dastard> References: <4C0E13A7.20402@msgid.tls.msk.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C0E13A7.20402@msgid.tls.msk.ru> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1276000165 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31967 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean [ cc'd XFS list ] On Tue, Jun 08, 2010 at 01:55:51PM +0400, Michael Tokarev wrote: > Hello. > > I've got a.. difficult issue here, and am asking if anyone else > has some expirence or information about it. > > Production environment (database). Machine with an Adaptec > RAID SCSI controller, 6 drives in raid10 array, XFS filesystem > and Oracle database on top of it (with - hopefully - proper > sunit/swidth). > > Upgrading kernel from 2.6.27 to 2.6.32, and users starts screaming > about very bad performance. Iostat reports increased I/O latencies, > I/O time increases from ~5ms to ~30ms. Switching back to 2.6.27, > and everything is back to normal (or, rather, usual). > > I tried testing I/O with a sample program which performs direct random > I/O on a given device, and all speeds are actually better in .32 > compared with .27, except of random concurrent r+w test, where .27 > gives a bit more chances to reads than .32. Looking at the synthetic > tests I'd expect .32 to be faster, but apparently it is not. > > This is only one machine here which is still running 2.6.27, all the > rest are upgraded to 2.6.32, and I see good performance of .32 there. > But this is also the only machine with hardware raid controller, which > is onboard and hence not easy to get rid of, so I'm sorta forced to > use it (I prefer software raid solution because of numerous reasons). > > One possible cause of this that comes to mind is block device write > barriers. But I can't find when they're actually implemented. > > The most problematic issue here is that this is only one machine that > behaves like this, and it is a production server, so I've very little > chances to experiment with it. > > So before the next try, I'd love to have some suggestions about what > to look for. In particular, I think it's worth the effort to look > at write barriers, but again, I don't know how to check if they're > actually being used. > > Anyone have suggestions for me to collect and to look at? http://xfs.org/index.php/XFS_FAQ#Q._Should_barriers_be_enabled_with_storage_which_has_a_persistent_write_cache.3F Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Tue Jun 8 11:03:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o58G3rn8220880 for ; Tue, 8 Jun 2010 11:03:54 -0500 X-ASG-Debug-ID: 1276013184-3d1002440000-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 8AE2D1B1B50E for ; Tue, 8 Jun 2010 09:06:24 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id YUeKgmn24SHuGjcS for ; Tue, 08 Jun 2010 09:06:24 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id A6A7042B9C4D; Tue, 8 Jun 2010 11:06:23 -0500 (CDT) Message-ID: <4C0E6A7F.2060808@sandeen.net> Date: Tue, 08 Jun 2010 11:06:23 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: aelder@sgi.com CC: xfs-oss X-ASG-Orig-Subj: Re: [PATCH V3] xfstests: use stat not lstat when examining devices Subject: Re: [PATCH V3] xfstests: use stat not lstat when examining devices References: <4C091B4E.5030503@sandeen.net> <4C0939B9.9000109@sandeen.net> <4C093F22.1010006@sandeen.net> <1275676010.2317.53.camel@doink> In-Reply-To: <1275676010.2317.53.camel@doink> 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: 1276013184 X-Barracuda-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.31980 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 Alex Elder wrote: > On Fri, 2010-06-04 at 13:00 -0500, Eric Sandeen wrote: >> If you try running xfstests on lvm volumes which are symlinks, >> it'll fail to run several tests because our _require_scratch >> framework ultimately uses lstat not stat, and does not think >> the lvm device (which is usually a symlink to a dm-X device) >> is a block device. Sigh. >> >> Just calling stat(1) with -L to follow the link should >> suffice. > > I wonder whether we'll find stat(1) output ever varies > enough to affect this. > > But otherwise this looks good to me. > > Reviewed-by: Alex Elder > >> Signed-off-by: Eric Sandeen Sorry, after all that I'm retracting this patch. mount, /proc/mounts, /etc/mtab etc just get very confused when using symlinked devices, at least as xfstests wants to use them. For now I'll just make my uber-harness resolve symlinks to the real device (maybe that could be done in xfstests at some point) -Eric From torvalds@linux-foundation.org Tue Jun 8 12:39:16 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o58HdGg8224638 for ; Tue, 8 Jun 2010 12:39:16 -0500 X-ASG-Debug-ID: 1276019083-62ad03270000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp1.linux-foundation.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A780810C8EB0 for ; Tue, 8 Jun 2010 10:44:43 -0700 (PDT) Received: from smtp1.linux-foundation.org (smtp1.linux-foundation.org [140.211.169.13]) by cuda.sgi.com with ESMTP id lModEZ9wmIIV35kg for ; Tue, 08 Jun 2010 10:44:43 -0700 (PDT) Received: from imap1.linux-foundation.org (imap1.linux-foundation.org [140.211.169.55]) by smtp1.linux-foundation.org (8.14.2/8.13.5/Debian-3ubuntu1.1) with ESMTP id o58HfTPP028490 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 8 Jun 2010 10:41:30 -0700 Received: from localhost (localhost [127.0.0.1]) by imap1.linux-foundation.org (8.13.5.20060308/8.13.5/Debian-3ubuntu1.1) with ESMTP id o58HfSc3015363; Tue, 8 Jun 2010 10:41:29 -0700 Date: Tue, 8 Jun 2010 10:41:28 -0700 (PDT) From: Linus Torvalds To: Dave Chinner cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: Re: [PATCH 0/6] writeback: tracing and fixes V4 Subject: Re: [PATCH 0/6] writeback: tracing and fixes V4 In-Reply-To: <1275957487-23633-1-git-send-email-david@fromorbit.com> Message-ID: References: <1275957487-23633-1-git-send-email-david@fromorbit.com> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-MIMEDefang-Filter: lf$Revision: 1.188 $ X-Scanned-By: MIMEDefang 2.63 on 140.211.169.13 X-Barracuda-Connect: smtp1.linux-foundation.org[140.211.169.13] X-Barracuda-Start-Time: 1276019084 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.31987 Rule breakdown below pts rule 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, 8 Jun 2010, Dave Chinner wrote: > > Can you please consider this patch series for 2.6.35? Yeah, no. See the several lkml discussions and the -rc2 announcement about how I do _not_ intend to merge anything even remotely "new code" this time around. So purely regression fixes and serious bugfixes (oopses/security issues). Kubys From akpm@linux-foundation.org Tue Jun 8 12:47:46 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o58HlksN225031 for ; Tue, 8 Jun 2010 12:47:46 -0500 X-ASG-Debug-ID: 1276019594-712d03090000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp1.linux-foundation.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E114B13120EA for ; Tue, 8 Jun 2010 10:53:14 -0700 (PDT) Received: from smtp1.linux-foundation.org (smtp1.linux-foundation.org [140.211.169.13]) by cuda.sgi.com with ESMTP id SXnBdRdtXyL109Rm for ; Tue, 08 Jun 2010 10:53:14 -0700 (PDT) Received: from imap1.linux-foundation.org (imap1.linux-foundation.org [140.211.169.55]) by smtp1.linux-foundation.org (8.14.2/8.13.5/Debian-3ubuntu1.1) with ESMTP id o58HoEZg029366 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 8 Jun 2010 10:50:16 -0700 Received: from localhost (localhost [127.0.0.1]) by imap1.linux-foundation.org (8.13.5.20060308/8.13.5/Debian-3ubuntu1.1) with SMTP id o58HoE6S015815; Tue, 8 Jun 2010 10:50:14 -0700 Date: Tue, 8 Jun 2010 10:50:18 -0700 From: Andrew Morton To: Linus Torvalds Cc: Dave Chinner , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 0/6] writeback: tracing and fixes V4 Subject: Re: [PATCH 0/6] writeback: tracing and fixes V4 Message-Id: <20100608105018.f7f82a1e.akpm@linux-foundation.org> In-Reply-To: References: <1275957487-23633-1-git-send-email-david@fromorbit.com> X-Mailer: Sylpheed 2.7.1 (GTK+ 2.18.9; x86_64-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: lf$Revision: 1.188 $ X-Scanned-By: MIMEDefang 2.63 on 140.211.169.13 X-Barracuda-Connect: smtp1.linux-foundation.org[140.211.169.13] X-Barracuda-Start-Time: 1276019594 X-Barracuda-Bayes: 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.31987 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 On Tue, 8 Jun 2010 10:41:28 -0700 (PDT) Linus Torvalds wrote: > > > On Tue, 8 Jun 2010, Dave Chinner wrote: > > > > Can you please consider this patch series for 2.6.35? > > Yeah, no. See the several lkml discussions and the -rc2 announcement about > how I do _not_ intend to merge anything even remotely "new code" this time > around. > > So purely regression fixes and serious bugfixes (oopses/security issues). Linus would have merged it. > Kubys But his evil twin got ahold of the keyboard. From BATV+c853dde7a93cc9944cf2+2480+infradead.org+hch@bombadil.srs.infradead.org Tue Jun 8 14:56:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o58Jugbi230005 for ; Tue, 8 Jun 2010 14:56:45 -0500 X-ASG-Debug-ID: 1276027154-21ae00fb0000-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 0272D14A978E for ; Tue, 8 Jun 2010 12:59:14 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id BhkDNAabYWUU5XH0 for ; Tue, 08 Jun 2010 12:59:14 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OM4x1-00012z-Ir for xfs@oss.sgi.com; Tue, 08 Jun 2010 19:59:08 +0000 Date: Tue, 8 Jun 2010 15:59:07 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: avoid synchronous transaction in xfs_fs_write_inode Subject: [PATCH] xfs: avoid synchronous transaction in xfs_fs_write_inode Message-ID: <20100608195905.GA577@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.20 (2009-08-17) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1276027155 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 rely on the fact that the sync code will cause a synchronous log force later on (currently via xfs_fs_sync_fs -> xfs_quiesce_data -> xfs_sync_data), so no need to do this here. This allows us to avoid a lot of synchronous log forces during sync, which pays of especially with delayed logging enabled. Some compilebench numbers that show this: xfs (delayed logging, 256k logbufs) =================================== intial create 25.94 MB/s 25.75 MB/s 25.64 MB/s create 8.54 MB/s 9.12 MB/s 9.15 MB/s patch 2.47 MB/s 2.47 MB/s 3.17 MB/s compile 29.65 MB/s 30.51 MB/s 27.33 MB/s clean 90.92 MB/s 98.83 MB/s 128.87 MB/s read tree 11.90 MB/s 11.84 MB/s 8.56 MB/s read compiled 28.75 MB/s 29.96 MB/s 24.25 MB/s delete tree 8.39 seconds 8.12 seconds 8.46 seconds delete compiled 8.35 seconds 8.44 seconds 5.11 seconds stat tree 6.03 seconds 5.59 seconds 5.19 seconds stat compiled tree 9.00 seconds 9.52 seconds 8.49 seconds xfs + write_inode log_force removal =================================== intial create 25.87 MB/s 25.76 MB/s 25.87 MB/s create 15.18 MB/s 14.80 MB/s 14.94 MB/s patch 3.13 MB/s 3.14 MB/s 3.11 MB/s compile 36.74 MB/s 37.17 MB/s 36.84 MB/s clean 226.02 MB/s 222.58 MB/s 217.94 MB/s read tree 15.14 MB/s 15.02 MB/s 15.14 MB/s read compiled tree 29.30 MB/s 29.31 MB/s 29.32 MB/s delete tree 6.22 seconds 6.14 seconds 6.15 seconds delete compiled tree 5.75 seconds 5.92 seconds 5.81 seconds stat tree 4.60 seconds 4.51 seconds 4.56 seconds stat compiled tree 4.07 seconds 3.87 seconds 3.96 seconds Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2010-06-08 21:14:40.509003917 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_super.c 2010-06-08 21:16:41.078005872 +0200 @@ -1025,7 +1025,6 @@ xfs_log_inode( */ xfs_trans_ijoin(tp, ip); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - xfs_trans_set_sync(tp); error = xfs_trans_commit(tp, 0); xfs_ilock_demote(ip, XFS_ILOCK_EXCL); @@ -1052,6 +1051,12 @@ xfs_fs_write_inode( * log and the fsync transactions we reduce the IOs we have * to do here from two (log and inode) to just the log. * + * We do not even have to use a log force / synchronous + * transaction here as the sync code will cause do + * synchronous log force later durinc the sync process. + * With delayed logging that means we reduce the amount + * of required I/O requests dramatically. + * * 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 From sandeen@sandeen.net Tue Jun 8 15:01:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_66,J_CHICKENPOX_74 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o58K19hE230198 for ; Tue, 8 Jun 2010 15:01:09 -0500 X-ASG-Debug-ID: 1276027420-21ad01150000-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 6673F1E0A4A8 for ; Tue, 8 Jun 2010 13:03:40 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 28n8EbUTE0SWE8zj for ; Tue, 08 Jun 2010 13:03:40 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from int-mx03.intmail.prod.int.phx2.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o58K3dmY003059 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 8 Jun 2010 16:03:40 -0400 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 o58K3dDn017907 for ; Tue, 8 Jun 2010 16:03:39 -0400 Message-ID: <4C0EA21B.8020703@sandeen.net> Date: Tue, 08 Jun 2010 15:03:39 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8) Gecko/20100301 Fedora/3.0.3-1.fc11 Lightning/1.0b2pre Thunderbird/3.0.3 MIME-Version: 1.0 To: xfs mailing list X-ASG-Orig-Subj: [PATCH] xfstests: resolve symlinked devices to real paths Subject: [PATCH] xfstests: resolve symlinked devices to real paths 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: 1276027421 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 you try running xfstests on lvm volumes which are symlinks, it'll fail to run several tests because our _require_scratch framework ultimately uses lstat not stat, and does not think the lvm device (which is usually a symlink to a dm-X device) is a block device. Sigh. Last try at this - just resolve any symlinked devicenames into their realpath(3) in common.config. This actually seems to work. Signed-off-by: Eric Sandeen --- diff --git a/common.config b/common.config index 926846b..e5b2483 100644 --- a/common.config +++ b/common.config @@ -208,6 +208,15 @@ else known_hosts fi +# Scripts just don't deal well with symlinked devices +if [ -L $TEST_DEV ]; then + TEST_DEV=`src/realpath $TEST_DEV` +fi + +if [ -L $SCRATCH_DEV ]; then + SCRATCH_DEV=`src/realpath $SCRATCH_DEV` +fi + echo $TEST_DEV | grep -q ":" > /dev/null 2>&1 if [ ! -b "$TEST_DEV" -a "$?" != "0" ]; then echo "common.config: Error: \$TEST_DEV ($TEST_DEV) is not a block device or a NFS filesystem" diff --git a/src/Makefile b/src/Makefile index 976133d..2399853 100644 --- a/src/Makefile +++ b/src/Makefile @@ -10,7 +10,8 @@ TARGETS = dirstress fill fill2 getpagesize holes lstat64 \ mmapcat append_reader append_writer dirperf metaperf \ devzero feature alloc fault fstest t_access_root \ godown resvtest writemod makeextents itrash rename \ - multi_open_unlink dmiperf unwritten_sync genhashnames t_holes + multi_open_unlink dmiperf unwritten_sync genhashnames t_holes \ + realpath LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \ diff --git a/src/realpath.c b/src/realpath.c new file mode 100644 index 0000000..997b1aa --- /dev/null +++ b/src/realpath.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include + +/* + * Simple wrapper around realpath(3) to get absolute path + * to a device name; many xfstests scripts don't cope well + * with symlinked devices due to differences in /proc/mounts, + * /etc/mtab, mount output, etc. + */ + +int main(int argc, char *argv[]) +{ + char path[PATH_MAX]; + char resolved_path[PATH_MAX]; + + if (argc != 2) { + printf("Usage: %s \n", argv[0]); + return 1; + } + + strncpy(path, argv[1], PATH_MAX-1); + + if (!realpath(path, resolved_path)) { + perror("Failed to resolve path for %s"); + return 1; + } + + printf("%s\n", resolved_path); + return 0; +} From mjt@tls.msk.ru Tue Jun 8 15:31:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_32 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o58KVVCK231406 for ; Tue, 8 Jun 2010 15:31:31 -0500 X-ASG-Debug-ID: 1276029419-385f03b20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from isrv.corpit.ru (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 25A9010C987A for ; Tue, 8 Jun 2010 13:36:59 -0700 (PDT) Received: from isrv.corpit.ru (isrv.corpit.ru [81.13.33.159]) by cuda.sgi.com with ESMTP id lGCYKdLnZLdSm9gE for ; Tue, 08 Jun 2010 13:36:59 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from [192.168.88.2] (mjt.vpn.tls.msk.ru [192.168.10.88]) by isrv.corpit.ru (Postfix) with ESMTP id C93FD4123B; Wed, 9 Jun 2010 00:34:00 +0400 (MSD) (envelope-from mjt@tls.msk.ru) Message-ID: <4C0EA938.9000104@msgid.tls.msk.ru> Date: Wed, 09 Jun 2010 00:34:00 +0400 From: Michael Tokarev Organization: Telecom Service, JSC User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.9) Gecko/20100411 Icedove/3.0.4 MIME-Version: 1.0 To: Dave Chinner CC: Linux-kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: xfs, 2.6.27=>.32 sync write 10 times slowdown [was: xfs, aacraid 2.6.27 => 2.6.32 results in 6 times slowdown] Subject: xfs, 2.6.27=>.32 sync write 10 times slowdown [was: xfs, aacraid 2.6.27 => 2.6.32 results in 6 times slowdown] References: <4C0E13A7.20402@msgid.tls.msk.ru> <20100608122919.GC7869@dastard> In-Reply-To: <20100608122919.GC7869@dastard> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: isrv.corpit.ru[81.13.33.159] X-Barracuda-Start-Time: 1276029421 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 08.06.2010 16:29, Dave Chinner wrote: > On Tue, Jun 08, 2010 at 01:55:51PM +0400, Michael Tokarev wrote: >> Hello. >> >> I've got a.. difficult issue here, and am asking if anyone else >> has some expirence or information about it. >> >> Production environment (database). Machine with an Adaptec >> RAID SCSI controller, 6 drives in raid10 array, XFS filesystem >> and Oracle database on top of it (with - hopefully - proper >> sunit/swidth). >> >> Upgrading kernel from 2.6.27 to 2.6.32, and users starts screaming >> about very bad performance. Iostat reports increased I/O latencies, >> I/O time increases from ~5ms to ~30ms. Switching back to 2.6.27, >> and everything is back to normal (or, rather, usual). >> >> I tried testing I/O with a sample program which performs direct random >> I/O on a given device, and all speeds are actually better in .32 >> compared with .27, except of random concurrent r+w test, where .27 >> gives a bit more chances to reads than .32. Looking at the synthetic >> tests I'd expect .32 to be faster, but apparently it is not. >> >> This is only one machine here which is still running 2.6.27, all the >> rest are upgraded to 2.6.32, and I see good performance of .32 there. >> But this is also the only machine with hardware raid controller, which >> is onboard and hence not easy to get rid of, so I'm sorta forced to >> use it (I prefer software raid solution because of numerous reasons). >> >> One possible cause of this that comes to mind is block device write >> barriers. But I can't find when they're actually implemented. >> >> The most problematic issue here is that this is only one machine that >> behaves like this, and it is a production server, so I've very little >> chances to experiment with it. >> >> So before the next try, I'd love to have some suggestions about what >> to look for. In particular, I think it's worth the effort to look >> at write barriers, but again, I don't know how to check if they're >> actually being used. >> >> Anyone have suggestions for me to collect and to look at? > > http://xfs.org/index.php/XFS_FAQ#Q._Should_barriers_be_enabled_with_storage_which_has_a_persistent_write_cache.3F Yes, I've seen this. We use xfs for quite long time. The on-board controller does not have battery unit, so it should be no different than a software raid array or single drive. But I traced the issue to a particular workload -- see $subject. Simple test doing random reads or writes of 4k blocks in a 1Gb file located on an xfs filesystem, Mb/sec: sync direct read write write 2.6.27 xfs 1.17 3.69 3.80 2.6.32 xfs 1.26 0.52 5.10 ^^^^ 2.6.32 ext3 1.19 4.91 5.02 Note the 10 times difference between O_SYNC and O_DIRECT writes in 2.6.32. This is, well, huge difference, and this is where the original slowdown comes from, apparently. In 2.6.27 both sync and direct writes are on-par with each other, in .32 direct write has improved, but sync write is just pathetic now. And compared with previous o_sync, that's about 6 times the difference which I reported previously. We're running a legacy oracle application here, on Oracle8, which does not support O_DIRECT and uses O_SYNC. So it gets hit by this issue quite badly - no doubt users start screaming after switching to .32. I also tested ext3fs, for comparison. This one does not have that problem and works just fine in both .32 and .27. I also tried disabling barriers for xfs, which made no difference whatsoever. So it's O_SYNC writes on XFS which are problematic. Together with hw raid apparently, since no one noticed when I switched other machines (with sw raid) from .27 to .32. I'll _try_ to find when the problem first appeared, but it is not that simple since I've only very small time window for testing. Thanks! /mjt From SRS0+R53I+8+fromorbit.com=david@internode.on.net Tue Jun 8 17:44:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o58MiMUv240211 for ; Tue, 8 Jun 2010 17:44:23 -0500 X-ASG-Debug-ID: 1276037389-714803810000-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 ED3DD10D05BE for ; Tue, 8 Jun 2010 15:49:50 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id 4j4FVUDeI7ef4qyP for ; Tue, 08 Jun 2010 15:49:50 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27200151-1927428 for multiple; Wed, 09 Jun 2010 08:16:17 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OM7Yl-0003Ii-CZ; Wed, 09 Jun 2010 08:46:15 +1000 Date: Wed, 9 Jun 2010 08:46:15 +1000 From: Dave Chinner To: Linus Torvalds Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: Re: [PATCH 0/6] writeback: tracing and fixes V4 Subject: Re: [PATCH 0/6] writeback: tracing and fixes V4 Message-ID: <20100608224615.GE7869@dastard> References: <1275957487-23633-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1276037391 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32004 Rule breakdown below pts rule 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, Jun 08, 2010 at 10:41:28AM -0700, Linus Torvalds wrote: > > > On Tue, 8 Jun 2010, Dave Chinner wrote: > > > > Can you please consider this patch series for 2.6.35? > > Yeah, no. See the several lkml discussions and the -rc2 announcement about > how I do _not_ intend to merge anything even remotely "new code" this time > around. > > So purely regression fixes and serious bugfixes (oopses/security issues). No worries, I'll re-order the series and send you just the bug fixes later this morning. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+YvFy+8+fromorbit.com=david@internode.on.net Tue Jun 8 18:16:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_22 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o58NGIbu242268 for ; Tue, 8 Jun 2010 18:16:18 -0500 X-ASG-Debug-ID: 1276039127-67c401820000-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 DB8DC14AB0C7 for ; Tue, 8 Jun 2010 16:18:48 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id xYeLYXP7uY9f0oyo for ; Tue, 08 Jun 2010 16:18:48 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27354871-1927428 for multiple; Wed, 09 Jun 2010 08:48:47 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OM84D-0003Kd-OU; Wed, 09 Jun 2010 09:18:45 +1000 Date: Wed, 9 Jun 2010 09:18:45 +1000 From: Dave Chinner To: Michael Tokarev Cc: Linux-kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs, 2.6.27=>.32 sync write 10 times slowdown [was: xfs, aacraid 2.6.27 => 2.6.32 results in 6 times slowdown] Subject: Re: xfs, 2.6.27=>.32 sync write 10 times slowdown [was: xfs, aacraid 2.6.27 => 2.6.32 results in 6 times slowdown] Message-ID: <20100608231845.GG7869@dastard> References: <4C0E13A7.20402@msgid.tls.msk.ru> <20100608122919.GC7869@dastard> <4C0EA938.9000104@msgid.tls.msk.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C0EA938.9000104@msgid.tls.msk.ru> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1276039129 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32005 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Jun 09, 2010 at 12:34:00AM +0400, Michael Tokarev wrote: > 08.06.2010 16:29, Dave Chinner wrote: > >On Tue, Jun 08, 2010 at 01:55:51PM +0400, Michael Tokarev wrote: > >>Hello. > >> > >>I've got a.. difficult issue here, and am asking if anyone else > >>has some expirence or information about it. > >> > >>Production environment (database). Machine with an Adaptec > >>RAID SCSI controller, 6 drives in raid10 array, XFS filesystem > >>and Oracle database on top of it (with - hopefully - proper > >>sunit/swidth). > >> > >>Upgrading kernel from 2.6.27 to 2.6.32, and users starts screaming > >>about very bad performance. Iostat reports increased I/O latencies, > >>I/O time increases from ~5ms to ~30ms. Switching back to 2.6.27, > >>and everything is back to normal (or, rather, usual). .... > >>The most problematic issue here is that this is only one machine that > >>behaves like this, and it is a production server, so I've very little > >>chances to experiment with it. > >> > >>So before the next try, I'd love to have some suggestions about what > >>to look for. In particular, I think it's worth the effort to look > >>at write barriers, but again, I don't know how to check if they're > >>actually being used. > >> > >>Anyone have suggestions for me to collect and to look at? > > > >http://xfs.org/index.php/XFS_FAQ#Q._Should_barriers_be_enabled_with_storage_which_has_a_persistent_write_cache.3F > > Yes, I've seen this. We use xfs for quite long time. The on-board > controller does not have battery unit, so it should be no different > than a software raid array or single drive. > > But I traced the issue to a particular workload -- see $subject. > > Simple test doing random reads or writes of 4k blocks in a 1Gb > file located on an xfs filesystem, Mb/sec: > > sync direct > read write write > 2.6.27 xfs 1.17 3.69 3.80 > 2.6.32 xfs 1.26 0.52 5.10 > ^^^^ > 2.6.32 ext3 1.19 4.91 5.02 > > Note the 10 times difference between O_SYNC and O_DIRECT writes > in 2.6.32. This is, well, huge difference, and this is where > the original slowdown comes from, apparently. Are you running on the raw block device, or on top of LVM/DM/MD to split up the space on the RAID drive? DM+MD have grown barrier support since 2.6.27, so it may be that barriers are now being passed down to the raid hardware on 2.6.32 and they never were on 2.6.27. Can you paste the output of dmesg when the XFS filesystem in question is mounted on both 2.6.27 and 2.6.32 so we can see if there is a difference in the use of barriers? Also, remember that O_DIRECT does not imply O_SYNC. O_DIRECT writes only write data, while O_SYNC will also write metadata and/or the log. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+GXiS+9+fromorbit.com=dave@internode.on.net Tue Jun 8 19:35:37 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o590ZbWS245424 for ; Tue, 8 Jun 2010 19:35:37 -0500 X-ASG-Debug-ID: 1276043887-50be00a10000-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 211521B1B358 for ; Tue, 8 Jun 2010 17:38:08 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id lb99TRPvkhDKtxoi for ; Tue, 08 Jun 2010 17:38:08 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27541070-1927428 for multiple; Wed, 09 Jun 2010 10:07:30 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OM9IO-0003Od-Eh; Wed, 09 Jun 2010 10:37:28 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OM9IK-0000WA-8t; Wed, 09 Jun 2010 10:37:24 +1000 From: Dave Chinner To: torvalds@linux-foundation.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: [PATCH 0/3] writeback: bug fixes for 2.6.35 Subject: [PATCH 0/3] writeback: bug fixes for 2.6.35 Date: Wed, 9 Jun 2010 10:37:17 +1000 Message-Id: <1276043840-1946-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1276043889 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0201 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32011 Rule breakdown below pts rule 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 Linus, This is a resend of my current writeback bug fixes without the preceding tracing patches. Please consider these for 2.6.35 as they are fixes for regressions introduced in previous kernel releases. Cheers, Dave. From SRS0+GGhX+9+fromorbit.com=dave@internode.on.net Tue Jun 8 19:35:37 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o590Zae0245422 for ; Tue, 8 Jun 2010 19:35:37 -0500 X-ASG-Debug-ID: 1276043886-50bb00970000-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 7E68014AB3B6 for ; Tue, 8 Jun 2010 17:38:07 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id 7TxG4z778tCAfLos for ; Tue, 08 Jun 2010 17:38:07 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27085731-1927428 for multiple; Wed, 09 Jun 2010 10:07:30 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OM9IO-0003Oe-IC; Wed, 09 Jun 2010 10:37:28 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OM9IK-0000WE-Cd; Wed, 09 Jun 2010 10:37:24 +1000 From: Dave Chinner To: torvalds@linux-foundation.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: [PATCH 2/3] xfs: remove nr_to_write writeback windup. Subject: [PATCH 2/3] xfs: remove nr_to_write writeback windup. Date: Wed, 9 Jun 2010 10:37:19 +1000 Message-Id: <1276043840-1946-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1276043840-1946-1-git-send-email-david@fromorbit.com> References: <1276043840-1946-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1276043888 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32011 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner Now that the background flush code has been fixed, we shouldn't need to silently multiply the wbc->nr_to_write to get good writeback. Remove that code. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_aops.c | 8 -------- 1 files changed, 0 insertions(+), 8 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index a0fa3bf..34640d6 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c @@ -1381,14 +1381,6 @@ xfs_vm_writepage( if (!page_has_buffers(page)) create_empty_buffers(page, 1 << inode->i_blkbits, 0); - - /* - * VM calculation for nr_to_write seems off. Bump it way - * up, this gets simple streaming writes zippy again. - * To be reviewed again after Jens' writeback changes. - */ - wbc->nr_to_write *= 4; - /* * Convert delayed allocate, unwritten or unmapped space * to real space and flush out to disk. -- 1.7.1 From SRS0+JRSS+9+fromorbit.com=dave@internode.on.net Tue Jun 8 19:35:44 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_ATTENTION autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o590Zig6245448 for ; Tue, 8 Jun 2010 19:35:44 -0500 X-ASG-Debug-ID: 1276044072-07b1016b0000-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 3574410D0BA4 for ; Tue, 8 Jun 2010 17:41:12 -0700 (PDT) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id u6KUmoAccAYU6Ap3 for ; Tue, 08 Jun 2010 17:41:12 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27124624-1927428 for multiple; Wed, 09 Jun 2010 10:07:39 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OM9IY-0003Om-FJ; Wed, 09 Jun 2010 10:37:38 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OM9IK-0000WC-Al; Wed, 09 Jun 2010 10:37:24 +1000 From: Dave Chinner To: torvalds@linux-foundation.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: [PATCH 1/3] writeback: pay attention to wbc->nr_to_write in write_cache_pages Subject: [PATCH 1/3] writeback: pay attention to wbc->nr_to_write in write_cache_pages Date: Wed, 9 Jun 2010 10:37:18 +1000 Message-Id: <1276043840-1946-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1276043840-1946-1-git-send-email-david@fromorbit.com> References: <1276043840-1946-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1276044074 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32012 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner If a filesystem writes more than one page in ->writepage, write_cache_pages fails to notice this and continues to attempt writeback when wbc->nr_to_write has gone negative - this trace was captured from XFS: wbc_writeback_start: towrt=1024 wbc_writepage: towrt=1024 wbc_writepage: towrt=0 wbc_writepage: towrt=-1 wbc_writepage: towrt=-5 wbc_writepage: towrt=-21 wbc_writepage: towrt=-85 This has adverse effects on filesystem writeback behaviour. write_cache_pages() needs to terminate after a certain number of pages are written, not after a certain number of calls to ->writepage are made. This is a regression introduced by 17bc6c30cf6bfffd816bdc53682dd46fc34a2cf4 ("vfs: Add no_nrwrite_index_update writeback control flag"), but cannot be reverted directly due to subsequent bug fixes that have gone in on top of it. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- include/linux/writeback.h | 9 --------- include/trace/events/ext4.h | 5 +---- mm/page-writeback.c | 15 +++++---------- 3 files changed, 6 insertions(+), 23 deletions(-) diff --git a/include/linux/writeback.h b/include/linux/writeback.h index f641346..d63ef8f 100644 --- a/include/linux/writeback.h +++ b/include/linux/writeback.h @@ -56,15 +56,6 @@ struct writeback_control { unsigned for_reclaim:1; /* Invoked from the page allocator */ unsigned range_cyclic:1; /* range_start is cyclic */ unsigned more_io:1; /* more io to be dispatched */ - /* - * write_cache_pages() won't update wbc->nr_to_write and - * mapping->writeback_index if no_nrwrite_index_update - * is set. write_cache_pages() may write more than we - * requested and we want to make sure nr_to_write and - * writeback_index are updated in a consistent manner - * so we use a single control to update them - */ - unsigned no_nrwrite_index_update:1; }; /* diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index f5b1ba9..f3865c7 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h @@ -306,7 +306,6 @@ TRACE_EVENT(ext4_da_writepages_result, __field( int, pages_written ) __field( long, pages_skipped ) __field( char, more_io ) - __field( char, no_nrwrite_index_update ) __field( pgoff_t, writeback_index ) ), @@ -317,16 +316,14 @@ TRACE_EVENT(ext4_da_writepages_result, __entry->pages_written = pages_written; __entry->pages_skipped = wbc->pages_skipped; __entry->more_io = wbc->more_io; - __entry->no_nrwrite_index_update = wbc->no_nrwrite_index_update; __entry->writeback_index = inode->i_mapping->writeback_index; ), - TP_printk("dev %s ino %lu ret %d pages_written %d pages_skipped %ld more_io %d no_nrwrite_index_update %d writeback_index %lu", + TP_printk("dev %s ino %lu ret %d pages_written %d pages_skipped %ld more_io %d writeback_index %lu", jbd2_dev_to_name(__entry->dev), (unsigned long) __entry->ino, __entry->ret, __entry->pages_written, __entry->pages_skipped, __entry->more_io, - __entry->no_nrwrite_index_update, (unsigned long) __entry->writeback_index) ); diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 5fa63bd..b3dbb80 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -835,7 +835,6 @@ int write_cache_pages(struct address_space *mapping, pgoff_t done_index; int cycled; int range_whole = 0; - long nr_to_write = wbc->nr_to_write; pagevec_init(&pvec, 0); if (wbc->range_cyclic) { @@ -935,11 +934,10 @@ continue_unlock: done = 1; break; } - } + } - if (nr_to_write > 0) { - nr_to_write--; - if (nr_to_write == 0 && + if (wbc->nr_to_write > 0) { + if (--wbc->nr_to_write == 0 && wbc->sync_mode == WB_SYNC_NONE) { /* * We stop writing back only if we are @@ -970,11 +968,8 @@ continue_unlock: end = writeback_index - 1; goto retry; } - if (!wbc->no_nrwrite_index_update) { - if (wbc->range_cyclic || (range_whole && nr_to_write > 0)) - mapping->writeback_index = done_index; - wbc->nr_to_write = nr_to_write; - } + if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0)) + mapping->writeback_index = done_index; return ret; } -- 1.7.1 From SRS0+/IkJ+9+fromorbit.com=dave@internode.on.net Tue Jun 8 19:35:49 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o590ZnnX245471 for ; Tue, 8 Jun 2010 19:35:49 -0500 X-ASG-Debug-ID: 1276043899-1eac02480000-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 5FCF81B1B359 for ; Tue, 8 Jun 2010 17:38:20 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id ptyXkoli3CmBZ7SW for ; Tue, 08 Jun 2010 17:38:20 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27268071-1927428 for multiple; Wed, 09 Jun 2010 10:07:40 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OM9IY-0003On-Ir; Wed, 09 Jun 2010 10:37:38 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OM9IK-0000WG-FU; Wed, 09 Jun 2010 10:37:24 +1000 From: Dave Chinner To: torvalds@linux-foundation.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org X-ASG-Orig-Subj: [PATCH 3/3] writeback: limit write_cache_pages integrity scanning to current EOF Subject: [PATCH 3/3] writeback: limit write_cache_pages integrity scanning to current EOF Date: Wed, 9 Jun 2010 10:37:20 +1000 Message-Id: <1276043840-1946-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1276043840-1946-1-git-send-email-david@fromorbit.com> References: <1276043840-1946-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1276043901 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32011 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner sync can currently take a really long time if a concurrent writer is extending a file. The problem is that the dirty pages on the address space grow in the same direction as write_cache_pages scans, so if the writer keeps ahead of writeback, the writeback will not terminate until the writer stops adding dirty pages. For a data integrity sync, we only need to write the pages dirty at the time we start the writeback, so we can stop scanning once we get to the page that was at the end of the file at the time the scan started. This will prevent operations like copying a large file preventing sync from completing as it will not write back pages that were dirtied after the sync was started. This does not impact the existing integrity guarantees, as any dirty page (old or new) within the EOF range at the start of the scan will still be captured. This patch will not prevent sync from blocking on large writes into holes. That requires more complex intervention while this patch only addresses the common append-case of this sync holdoff. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- mm/page-writeback.c | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-) diff --git a/mm/page-writeback.c b/mm/page-writeback.c index b3dbb80..bbd396a 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -851,7 +851,22 @@ int write_cache_pages(struct address_space *mapping, if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) range_whole = 1; cycled = 1; /* ignore range_cyclic tests */ + + /* + * If this is a data integrity sync, cap the writeback to the + * current end of file. Any extension to the file that occurs + * after this is a new write and we don't need to write those + * pages out to fulfil our data integrity requirements. If we + * try to write them out, we can get stuck in this scan until + * the concurrent writer stops adding dirty pages and extending + * EOF. + */ + if (wbc->sync_mode == WB_SYNC_ALL && + wbc->range_end == LLONG_MAX) { + end = i_size_read(mapping->host) >> PAGE_CACHE_SHIFT; + } } + retry: done_index = index; while (!done && (index <= end)) { -- 1.7.1 From sandeen@sandeen.net Tue Jun 8 22:25:44 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o593Phs7252009 for ; Tue, 8 Jun 2010 22:25:43 -0500 X-ASG-Debug-ID: 1276054271-5ef001d80000-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 15C5396CFFD for ; Tue, 8 Jun 2010 20:31:12 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id u5c9O5RUnwp8tnC5 for ; Tue, 08 Jun 2010 20:31:12 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 3DAD54968903 for ; Tue, 8 Jun 2010 22:28:12 -0500 (CDT) Message-ID: <4C0F0A4C.7050600@sandeen.net> Date: Tue, 08 Jun 2010 22:28:12 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: [PATCH] xfstests 217: remove file in between mkfs's Subject: [PATCH] xfstests 217: remove file in between mkfs's 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: 1276054273 X-Barracuda-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.32021 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 217 requires a 2G scratch: _require_fs_space $SCRATCH_MNT 2202000 but as we mkfs different sizes, we actually are filling in the sparse loopback more and more, and 3.8G isn't enough to contain it. If we remove & recreate the file between mkfs's it doesn't take so much space ... I don't think it adds significantly to test time. Signed-off-by: Eric Sandeen --- diff --git a/217 b/217 index 19540ad..ed86a51 100755 --- a/217 +++ b/217 @@ -60,6 +60,9 @@ LOOP_MNT=$SCRATCH_MNT/test_fs_dir _do_mkfs() { for i in $*; do + # make large holey file + rm -f $LOOP_DEV + $XFS_IO_PROG -f -c "truncate 16383g" $LOOP_DEV echo -n "fssize=${i}g " $MKFS_XFS_PROG -f -b size=4096 -l version=2 \ -d name=$LOOP_DEV,size=${i}g |grep log From mjt@tls.msk.ru Wed Jun 9 01:41:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_22 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o596f7ES261617 for ; Wed, 9 Jun 2010 01:41:07 -0500 X-ASG-Debug-ID: 1276065818-077d02b90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from isrv.corpit.ru (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E336C3A93D8 for ; Tue, 8 Jun 2010 23:43:38 -0700 (PDT) Received: from isrv.corpit.ru (isrv.corpit.ru [81.13.33.159]) by cuda.sgi.com with ESMTP id bkZ8wf0DQGUIK3Qp for ; Tue, 08 Jun 2010 23:43:38 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from [192.168.88.2] (mjt.vpn.tls.msk.ru [192.168.10.88]) by isrv.corpit.ru (Postfix) with ESMTP id 6A8CE41377; Wed, 9 Jun 2010 10:43:37 +0400 (MSD) (envelope-from mjt@tls.msk.ru) Message-ID: <4C0F3819.4000409@msgid.tls.msk.ru> Date: Wed, 09 Jun 2010 10:43:37 +0400 From: Michael Tokarev Organization: Telecom Service, JSC User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.9) Gecko/20100411 Icedove/3.0.4 MIME-Version: 1.0 To: Dave Chinner CC: Linux-kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs, 2.6.27=>.32 sync write 10 times slowdown [was: xfs, aacraid 2.6.27 => 2.6.32 results in 6 times slowdown] Subject: Re: xfs, 2.6.27=>.32 sync write 10 times slowdown [was: xfs, aacraid 2.6.27 => 2.6.32 results in 6 times slowdown] References: <4C0E13A7.20402@msgid.tls.msk.ru> <20100608122919.GC7869@dastard> <4C0EA938.9000104@msgid.tls.msk.ru> <20100608231845.GG7869@dastard> In-Reply-To: <20100608231845.GG7869@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: isrv.corpit.ru[81.13.33.159] X-Barracuda-Start-Time: 1276065819 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 09.06.2010 03:18, Dave Chinner wrote: > On Wed, Jun 09, 2010 at 12:34:00AM +0400, Michael Tokarev wrote: [] >> Simple test doing random reads or writes of 4k blocks in a 1Gb >> file located on an xfs filesystem, Mb/sec: >> >> sync direct >> read write write >> 2.6.27 xfs 1.17 3.69 3.80 >> 2.6.32 xfs 1.26 0.52 5.10 >> ^^^^ >> 2.6.32 ext3 1.19 4.91 5.02 >> >> Note the 10 times difference between O_SYNC and O_DIRECT writes >> in 2.6.32. This is, well, huge difference, and this is where >> the original slowdown comes from, apparently. > > Are you running on the raw block device, or on top of LVM/DM/MD to > split up the space on the RAID drive? DM+MD have grown barrier > support since 2.6.27, so it may be that barriers are now being > passed down to the raid hardware on 2.6.32 and they never were on > 2.6.27. Can you paste the output of dmesg when the XFS filesystem in That's why I asked how to tell if barriers are actually hitting the device in question. No, this is the only machine where DM/MD is _not_ used. On all other machines we use MD software raid, this machine comes with an onboard raid controller that does not work in JBOD mode so I weren't able to use linux software raid. This is XFS on top of Adaptec RAID card, nothing in-between. Also, as I mentioned in the previous email, remounting with nobarrier makes no difference whatsoever. (Another side note here - I discovered that unknown options are silently ignored in "remount mode" while correctly rejected in "plain mount" mode, -- it looks like a kernel bug actually, but it's entirely different issue). > question is mounted on both 2.6.27 and 2.6.32 so we can see if > there is a difference in the use of barriers? > > Also, remember that O_DIRECT does not imply O_SYNC. O_DIRECT writes > only write data, while O_SYNC will also write metadata and/or the > log. I know this. I also found osyncisosync and osyncisdsync mount options, and when I try to use the latter, kernel tells it's the default and hence deprecated. I don't need metadata updates, but it _looks_ like the system is doing such updates (with barriers or flushes?) anyway even when mounted with -o osyncisdsync it behaves the same: very slow. I also experimented with both O_SYNC|O_DIRECT: it is as slow as without O_DIRECT, i.e. O_SYNC makes whole thing slow regardless of other options. I looked at the dmesg outputs, and there's no relevant differences related to block devices or usage of barriers. For XFS it always mounts like this: SGI XFS with ACLs, security attributes, large block/inode numbers, no debug enabled SGI XFS Quota Management subsystem XFS mounting filesystem sda6 and for the device in question, it is always like Adaptec aacraid driver 1.1-5[2456]-ms aacraid 0000:03:01.0: PCI INT A -> GSI 24 (level, low) -> IRQ 24 AAC0: kernel 5.1-0[8832] Feb 1 2006 AAC0: monitor 5.1-0[8832] AAC0: bios 5.1-0[8832] AAC0: serial 267BE0 AAC0: Non-DASD support enabled. AAC0: 64bit support enabled. AAC0: 64 Bit DAC enabled scsi0 : aacraid scsi 0:0:0:0: Direct-Access Adaptec f0500 V1.0 PQ: 0 ANSI: 2 sd 0:0:0:0: [sda] 286715904 512-byte hardware sectors (146799 MB) sd 0:0:0:0: [sda] Write Protect is off sd 0:0:0:0: [sda] Mode Sense: 06 00 10 00 sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, supports DPO and FUA sda: sda1 sda2 sda3 < sda5 sda6 > There are tons of other differences, but that is to be expected (like format of CPU topology printing which is changed between .27 and .32). Thanks! /mjt From michael.monnerie@is.it-management.at Wed Jun 9 02:06:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5976XLm000817 for ; Wed, 9 Jun 2010 02:06:33 -0500 X-ASG-Debug-ID: 1276067522-1728024a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6118B10D1030 for ; Wed, 9 Jun 2010 00:12:03 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id rQUQBKv3q13312zV for ; Wed, 09 Jun 2010 00:12:03 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 2C68317B for ; Wed, 9 Jun 2010 09:09:02 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id D735783C804 for ; Wed, 9 Jun 2010 09:09:01 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs, 2.6.27=>.32 sync write 10 times slowdown [was: xfs, aacraid 2.6.27 => 2.6.32 results in 6 times slowdown] Subject: Re: xfs, 2.6.27=>.32 sync write 10 times slowdown [was: xfs, aacraid 2.6.27 => 2.6.32 results in 6 times slowdown] Date: Wed, 9 Jun 2010 09:09:01 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) References: <4C0E13A7.20402@msgid.tls.msk.ru> <20100608231845.GG7869@dastard> <4C0F3819.4000409@msgid.tls.msk.ru> In-Reply-To: <4C0F3819.4000409@msgid.tls.msk.ru> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart16165749.FA3z0o6Q28"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201006090909.01354@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1276067524 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.32035 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart16165749.FA3z0o6Q28 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Mittwoch, 9. Juni 2010 Michael Tokarev wrote: > AAC0: kernel 5.1-0[8832] Feb 1 2006 =20 Damn old piece of controller. Maybe you can try a firmware upgrade? I=20 use Areca controllers, and that helped a lot with them. Maybe something=20 between 2.6.27 and 2.6.32 exploited a firmware problem. =2D-=20 mit freundlichen Gr=FCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=E4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart16165749.FA3z0o6Q28 Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkwPPg0ACgkQzhSR9xwSCbSvoQCg4WAEQrZu+8uyVBiYMsopHOTJ frQAnA7LVJ7RIa0Lew8yCZwnhNu1mnFl =uNwe -----END PGP SIGNATURE----- --nextPart16165749.FA3z0o6Q28-- From SRS0+o0I6+9+fromorbit.com=david@internode.on.net Wed Jun 9 02:26:44 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_55, J_CHICKENPOX_56 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o597QhrE001612 for ; Wed, 9 Jun 2010 02:26:44 -0500 X-ASG-Debug-ID: 1276068554-2aaa02060000-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 CB41D3A987C for ; Wed, 9 Jun 2010 00:29:14 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id 1MBqN5PChKWIlpaY for ; Wed, 09 Jun 2010 00:29:14 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27323257-1927428 for multiple; Wed, 09 Jun 2010 16:59:13 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OMFip-0003jp-GB; Wed, 09 Jun 2010 17:29:11 +1000 Date: Wed, 9 Jun 2010 17:29:11 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: avoid synchronous transaction in xfs_fs_write_inode Subject: Re: [PATCH] xfs: avoid synchronous transaction in xfs_fs_write_inode Message-ID: <20100609072911.GI7869@dastard> References: <20100608195905.GA577@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100608195905.GA577@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1276068555 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32035 Rule breakdown below pts rule 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, Jun 08, 2010 at 03:59:07PM -0400, Christoph Hellwig wrote: > > We already rely on the fact that the sync code will cause a synchronous > log force later on (currently via xfs_fs_sync_fs -> xfs_quiesce_data -> > xfs_sync_data), so no need to do this here. This allows us to avoid > a lot of synchronous log forces during sync, which pays of especially > with delayed logging enabled. Some compilebench numbers that show > this: > > xfs (delayed logging, 256k logbufs) > =================================== > > intial create 25.94 MB/s 25.75 MB/s 25.64 MB/s > create 8.54 MB/s 9.12 MB/s 9.15 MB/s > patch 2.47 MB/s 2.47 MB/s 3.17 MB/s > compile 29.65 MB/s 30.51 MB/s 27.33 MB/s > clean 90.92 MB/s 98.83 MB/s 128.87 MB/s > read tree 11.90 MB/s 11.84 MB/s 8.56 MB/s > read compiled 28.75 MB/s 29.96 MB/s 24.25 MB/s > delete tree 8.39 seconds 8.12 seconds 8.46 seconds > delete compiled 8.35 seconds 8.44 seconds 5.11 seconds > stat tree 6.03 seconds 5.59 seconds 5.19 seconds > stat compiled tree 9.00 seconds 9.52 seconds 8.49 seconds > > > xfs + write_inode log_force removal > =================================== > intial create 25.87 MB/s 25.76 MB/s 25.87 MB/s > create 15.18 MB/s 14.80 MB/s 14.94 MB/s > patch 3.13 MB/s 3.14 MB/s 3.11 MB/s > compile 36.74 MB/s 37.17 MB/s 36.84 MB/s > clean 226.02 MB/s 222.58 MB/s 217.94 MB/s > read tree 15.14 MB/s 15.02 MB/s 15.14 MB/s > read compiled tree 29.30 MB/s 29.31 MB/s 29.32 MB/s > delete tree 6.22 seconds 6.14 seconds 6.15 seconds > delete compiled tree 5.75 seconds 5.92 seconds 5.81 seconds > stat tree 4.60 seconds 4.51 seconds 4.56 seconds > stat compiled tree 4.07 seconds 3.87 seconds 3.96 seconds > > Signed-off-by: Christoph Hellwig All great - I attempted this myself - but it breaks bulkstat. See xfstest 183: 183 2s ... - output mismatch (see 183.out.bad) --- 183.out 2010-04-28 15:00:22.000000000 +1000 +++ 183.out.bad 2010-06-09 17:10:23.000000000 +1000 @@ -1,4 +1,4 @@ QA output created by 183 Start original bulkstat_unlink_test with -r switch Runing extended checks. -Iteration 0 ... (100 files)passed +Iteration 0 ... (100 files)ERROR, count(2) != scount(1). Ran: 183 Failures: 183 Failed 1 of 1 tests Test 183 fails with this patch because it leaves the inode pinned in the WB_SYNC_ALL case after calling xfs_log_inode(), and so the inode can't be flushed to the backing buffer. Hence bulkstat may not see changes to an inode after a sync becuase they weren't flushed during the sync. I think that we need to revisit bulkstat's use of the backing buffers for performance reasons now we have a much more scalable inode cache. Having to keep the backing buffers coherent is only going to be more problematic in future as things get even more asynchronous.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Wed Jun 9 02:40:37 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o597ea0W002152 for ; Wed, 9 Jun 2010 02:40:37 -0500 X-ASG-Debug-ID: 1276069568-37a703170000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from greer.hardwarefreak.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C1AF810D12B5 for ; Wed, 9 Jun 2010 00:46:08 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id WkiTlOcP29OT2S7Q for ; Wed, 09 Jun 2010 00:46:08 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id E40166C3CE for ; Wed, 9 Jun 2010 02:43:07 -0500 (CDT) Message-ID: <4C0F470D.40805@hardwarefreak.com> Date: Wed, 09 Jun 2010 02:47:25 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs, 2.6.27=>.32 sync write 10 times slowdown [was: xfs, aacraid 2.6.27 => 2.6.32 results in 6 times slowdown] Subject: Re: xfs, 2.6.27=>.32 sync write 10 times slowdown [was: xfs, aacraid 2.6.27 => 2.6.32 results in 6 times slowdown] References: <4C0E13A7.20402@msgid.tls.msk.ru> <20100608122919.GC7869@dastard> <4C0EA938.9000104@msgid.tls.msk.ru> <20100608231845.GG7869@dastard> <4C0F3819.4000409@msgid.tls.msk.ru> In-Reply-To: <4C0F3819.4000409@msgid.tls.msk.ru> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1276069568 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0656 1.0000 -1.6022 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.00 X-Barracuda-Spam-Status: No, SCORE=-1.00 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.32036 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 Michael Tokarev put forth on 6/9/2010 1:43 AM: > Adaptec aacraid driver 1.1-5[2456]-ms Are you able to try newer 2.6.32.x or 2.6.33.x kernels? Have you tried a 2.6.30 series kernel? Are you rolling your own kernels or using distro provided kernels? -- Stan From SRS0+fHnJ+9+fromorbit.com=david@internode.on.net Wed Jun 9 02:45:14 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_22 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o597jEe2002443 for ; Wed, 9 Jun 2010 02:45:14 -0500 X-ASG-Debug-ID: 1276069664-668402380000-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 4C6D11D57AE3 for ; Wed, 9 Jun 2010 00:47:45 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id iEFyDDoAfimFd1tU for ; Wed, 09 Jun 2010 00:47:45 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27601230-1927428 for multiple; Wed, 09 Jun 2010 17:17:43 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OMG0k-0003lJ-1i; Wed, 09 Jun 2010 17:47:42 +1000 Date: Wed, 9 Jun 2010 17:47:41 +1000 From: Dave Chinner To: Michael Tokarev Cc: Linux-kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs, 2.6.27=>.32 sync write 10 times slowdown [was: xfs, aacraid 2.6.27 => 2.6.32 results in 6 times slowdown] Subject: Re: xfs, 2.6.27=>.32 sync write 10 times slowdown [was: xfs, aacraid 2.6.27 => 2.6.32 results in 6 times slowdown] Message-ID: <20100609074741.GJ7869@dastard> References: <4C0E13A7.20402@msgid.tls.msk.ru> <20100608122919.GC7869@dastard> <4C0EA938.9000104@msgid.tls.msk.ru> <20100608231845.GG7869@dastard> <4C0F3819.4000409@msgid.tls.msk.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C0F3819.4000409@msgid.tls.msk.ru> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1276069666 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32035 Rule breakdown below pts rule 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, Jun 09, 2010 at 10:43:37AM +0400, Michael Tokarev wrote: > 09.06.2010 03:18, Dave Chinner wrote: > >On Wed, Jun 09, 2010 at 12:34:00AM +0400, Michael Tokarev wrote: > [] > >>Simple test doing random reads or writes of 4k blocks in a 1Gb > >>file located on an xfs filesystem, Mb/sec: > >> > >> sync direct > >> read write write > >>2.6.27 xfs 1.17 3.69 3.80 > >>2.6.32 xfs 1.26 0.52 5.10 > >> ^^^^ > >>2.6.32 ext3 1.19 4.91 5.02 Out of curiousity, what does 2.6.34 get on this workload? Also, what happens if you test with noop or deadline scheduler, rather than cfq (or whichever one you are using)? i.e. is this a scheduler regression rather than a filesystem issue? Also, a block trace of the sync write workload on both .27 and .32 would be interesting to see what the difference in IO patterns is... > >>Note the 10 times difference between O_SYNC and O_DIRECT writes > >>in 2.6.32. This is, well, huge difference, and this is where > >>the original slowdown comes from, apparently. > > > >Are you running on the raw block device, or on top of LVM/DM/MD to > >split up the space on the RAID drive? DM+MD have grown barrier > >support since 2.6.27, so it may be that barriers are now being > >passed down to the raid hardware on 2.6.32 and they never were on > >2.6.27. Can you paste the output of dmesg when the XFS filesystem in > > That's why I asked how to tell if barriers are actually hitting the > device in question. > > No, this is the only machine where DM/MD is _not_ used. On all other > machines we use MD software raid, this machine comes with an onboard > raid controller that does not work in JBOD mode so I weren't able to > use linux software raid. This is XFS on top of Adaptec RAID card, > nothing in-between. Well, I normally just create a raid0 lun per disk in those cases, hence the luns present the storage to linux as a JBOD.... > I also experimented with both O_SYNC|O_DIRECT: it is as slow as > without O_DIRECT, i.e. O_SYNC makes whole thing slow regardless > of other options. So it's the inode writeback that is causing the slowdown. We've recently changed O_SYNC semantics to be real O_SYNC, not O_DSYNC as .27 is. I can't remember if that was in 2.6.32 or not, but there's definitely a recent change to O_SYNC behaviouri that would cause this... > related to block devices or usage of barriers. For XFS it always > mounts like this: > > SGI XFS with ACLs, security attributes, large block/inode numbers, no debug enabled > SGI XFS Quota Management subsystem > XFS mounting filesystem sda6 So barriers are being issued. > and for the device in question, it is always like > > Adaptec aacraid driver 1.1-5[2456]-ms > aacraid 0000:03:01.0: PCI INT A -> GSI 24 (level, low) -> IRQ 24 > AAC0: kernel 5.1-0[8832] Feb 1 2006 Old firmware. An update might help. Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+8834fde08b4412f74bd9+2481+infradead.org+hch@bombadil.srs.infradead.org Wed Jun 9 08:23:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o59DN5mJ015990 for ; Wed, 9 Jun 2010 08:23:07 -0500 X-ASG-Debug-ID: 1276090119-2ff303050000-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 74785158FF1C for ; Wed, 9 Jun 2010 06:28:39 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id 0ziie5tdtcCRRdLS for ; Wed, 09 Jun 2010 06:28:39 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OMLHk-0008Rx-1N; Wed, 09 Jun 2010 13:25:36 +0000 Date: Wed, 9 Jun 2010 09:25:36 -0400 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss X-ASG-Orig-Subj: Re: [PATCH] xfstests 217: remove file in between mkfs's Subject: Re: [PATCH] xfstests 217: remove file in between mkfs's Message-ID: <20100609132536.GA31729@infradead.org> References: <4C0F0A4C.7050600@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C0F0A4C.7050600@sandeen.net> User-Agent: Mutt/1.5.20 (2009-08-17) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1276090119 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, Jun 08, 2010 at 10:28:12PM -0500, Eric Sandeen wrote: > 217 requires a 2G scratch: > > _require_fs_space $SCRATCH_MNT 2202000 > > but as we mkfs different sizes, we actually are filling in the > sparse loopback more and more, and 3.8G isn't enough to contain it. > > If we remove & recreate the file between mkfs's it doesn't take > so much space ... I don't think it adds significantly to test time. > > Signed-off-by: Eric Sandeen Looks good, Reviewed-by: Christoph Hellwig From sandeen@sandeen.net Wed Jun 9 10:21:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o59FLZsW020864 for ; Wed, 9 Jun 2010 10:21:36 -0500 X-ASG-Debug-ID: 1276097031-58c103db0000-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 B85C93ACC6D for ; Wed, 9 Jun 2010 08:23:51 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id joSOj0ejgD2DPsGJ for ; Wed, 09 Jun 2010 08:23:51 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 8351D4968903; Wed, 9 Jun 2010 10:23:51 -0500 (CDT) Message-ID: <4C0FB207.20706@sandeen.net> Date: Wed, 09 Jun 2010 10:23:51 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: xfs-oss CC: Amit Arora X-ASG-Orig-Subj: [PATCH] xfstests 228: suppress core dump message Subject: [PATCH] xfstests 228: suppress core dump message 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: 1276097032 X-Barracuda-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.32064 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 running 228 with abrt on in rhel6, I was getting different output due to a (core dumped) message on SIGXFSZ. For some reason I wasn't able to use sed to filter it, and just ulimit -c 0 didn't suppress it either. abrt sets the core pattern to: "|/usr/libexec/abrt-hook-ccpp /var/spool/abrt %p %s %u %c"" which apparently allows core dumps even if ulimit -c is 0, due to the pipe. Temporarily changing the kernel's core pattern to just plain "core" and setting ulimit -c to 0 does suppress it. These are reset to original values after the test is run. Signed-off-by: Eric Sandeen --- --- 228.orig 2010-06-09 11:13:27.000000000 -0400 +++ 228 2010-06-09 11:19:57.000000000 -0400 @@ -31,6 +31,8 @@ { cd / rm -f $tmp.* + sysctl -w kernel.core_pattern="$core_pattern" &>/dev/null + ulimit -c $ulimit_c } here=`pwd` @@ -58,6 +60,12 @@ avail=`df -P $TEST_DIR | awk 'END {print $4}'` [ "$avail" -ge 104000 ] || _notrun "Test device is too small ($avail KiB)" +# Suppress core dumped messages +core_pattern=`sysctl kernel.core_pattern | awk -F = '{print $NF}'` +ulimit_c=`ulimit -c` +sysctl -w kernel.core_pattern=core &>/dev/null +ulimit -c 0 + # Set the FSIZE ulimit to 100MB and check ulimit -f 102400 flim=`ulimit -f` From sandeen@sandeen.net Wed Jun 9 12:47:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o59Hlaae026182 for ; Wed, 9 Jun 2010 12:47:36 -0500 X-ASG-Debug-ID: 1276105791-4bad028f0000-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 911773AD6E7 for ; Wed, 9 Jun 2010 10:49:51 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id tMcIj0U0Fm5rHuEt for ; Wed, 09 Jun 2010 10:49:51 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id AFAF14968903; Wed, 9 Jun 2010 12:49:50 -0500 (CDT) Message-ID: <4C0FD43D.3040803@sandeen.net> Date: Wed, 09 Jun 2010 12:49:49 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: Jan Kara CC: xfs@oss.sgi.com, hch@infradead.org X-ASG-Orig-Subj: Re: [PATCH 4/8] Add test of quota accounting using fsx Subject: Re: [PATCH 4/8] Add test of quota accounting using fsx References: <1274710459-11446-1-git-send-email-jack@suse.cz> <1274710459-11446-5-git-send-email-jack@suse.cz> In-Reply-To: <1274710459-11446-5-git-send-email-jack@suse.cz> 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: 1276105791 X-Barracuda-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.32072 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 Jan Kara wrote: > Run fsx (and also several fsx threads in parallel) and verify that > quota accounting is correct after they finish. Jan, I'm having trouble with this one on XFS for some reason, with our RHEL6 kernel and quota-3.17... +Disabling group quota enforcement and accounting on /dev/mapper/VolGroup00-testvol2 +Disabling user quota enforcement and accounting on /dev/mapper/VolGroup00-testvol2 +repquota: Mountpoint (or device) /mnt/testarea/scratch not found or has no quota enabled. +repquota: Not all specified mountpoints are using quota. +repquota: Mountpoint (or device) /mnt/testarea/scratch not found or has no quota enabled. +repquota: Not all specified mountpoints are using quota. ... however if I remove the quotaon calls (off / on settings) in check_usage() then it works: check_usage() { # quotaon -f -u -g $SCRATCH_MNT 2>/dev/null repquota -u -g $SCRATCH_MNT | grep -v "^root" | filter_scratch \ >$tmp.orig quotacheck -u -g $SCRATCH_MNT 2>/dev/null repquota -u -g $SCRATCH_MNT | grep -v "^root" | filter_scratch \ >$tmp.checked # quotaon -u -g $SCRATCH_MNT 2>/dev/null diff $tmp.orig $tmp.checked } Seems like 2 issues: noisy disable messages, and repquota failing when disabled. Any ideas? Thanks, -Eric From mjt@tls.msk.ru Wed Jun 9 14:09:24 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o59J9N74028872 for ; Wed, 9 Jun 2010 14:09:24 -0500 X-ASG-Debug-ID: 1276110897-130101b80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from isrv.corpit.ru (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A87F7121685F for ; Wed, 9 Jun 2010 12:14:57 -0700 (PDT) Received: from isrv.corpit.ru (isrv.corpit.ru [81.13.33.159]) by cuda.sgi.com with ESMTP id PevBAxsiQubbNLr8 for ; Wed, 09 Jun 2010 12:14:57 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from [192.168.88.2] (mjt.vpn.tls.msk.ru [192.168.10.88]) by isrv.corpit.ru (Postfix) with ESMTP id 00591414CF; Wed, 9 Jun 2010 23:11:53 +0400 (MSD) (envelope-from mjt@tls.msk.ru) Message-ID: <4C0FE779.8010603@msgid.tls.msk.ru> Date: Wed, 09 Jun 2010 23:11:53 +0400 From: Michael Tokarev Organization: Telecom Service, JSC User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.9) Gecko/20100411 Icedove/3.0.4 MIME-Version: 1.0 To: Dave Chinner CC: Linux-kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs, 2.6.27=>.32 sync write 10 times slowdown [was: xfs, aacraid 2.6.27 => 2.6.32 results in 6 times slowdown] Subject: Re: xfs, 2.6.27=>.32 sync write 10 times slowdown [was: xfs, aacraid 2.6.27 => 2.6.32 results in 6 times slowdown] References: <4C0E13A7.20402@msgid.tls.msk.ru> <20100608122919.GC7869@dastard> <4C0EA938.9000104@msgid.tls.msk.ru> <20100608231845.GG7869@dastard> <4C0F3819.4000409@msgid.tls.msk.ru> <20100609074741.GJ7869@dastard> In-Reply-To: <20100609074741.GJ7869@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: isrv.corpit.ru[81.13.33.159] X-Barracuda-Start-Time: 1276110898 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 09.06.2010 11:47, Dave Chinner wrote: > On Wed, Jun 09, 2010 at 10:43:37AM +0400, Michael Tokarev wrote: >> 09.06.2010 03:18, Dave Chinner wrote: >>> On Wed, Jun 09, 2010 at 12:34:00AM +0400, Michael Tokarev wrote: >> [] >>>> Simple test doing random reads or writes of 4k blocks in a 1Gb >>>> file located on an xfs filesystem, Mb/sec: >>>> >>>> sync direct >>>> read write write >>>> 2.6.27 xfs 1.17 3.69 3.80 >>>> 2.6.32 xfs 1.26 0.52 5.10 >>>> ^^^^ >>>> 2.6.32 ext3 1.19 4.91 5.02 > > Out of curiousity, what does 2.6.34 get on this workload? 2.6.34 works quite well: 2.6.34 xfs 1.14 4.75 5.00 The same is with -o osyncisosync (in .34). Actually, osyncis[od]sync mount options does not change anything, not in .32 nor in .34. > Also, what happens if you test with noop or deadline scheduler, > rather than cfq (or whichever one you are using)? i.e. is this a > scheduler regression rather than a filesystem issue? Using deadline. Switching to noop makes no difference whatsoever. > Also, a block trace of the sync write workload on both .27 and .32 > would be interesting to see what the difference in IO patterns is... I see. Will try to collect them. With the limited timeframe I have to do any testing. [] > Well, I normally just create a raid0 lun per disk in those cases, > hence the luns present the storage to linux as a JBOD.... That's, um, somewhat ugly :) >> I also experimented with both O_SYNC|O_DIRECT: it is as slow as >> without O_DIRECT, i.e. O_SYNC makes whole thing slow regardless >> of other options. > > So it's the inode writeback that is causing the slowdown. We've > recently changed O_SYNC semantics to be real O_SYNC, not O_DSYNC > as .27 is. I can't remember if that was in 2.6.32 or not, but > there's definitely a recent change to O_SYNC behaviouri that would > cause this... But there are two mount options that seems to control this behavour: osyncisosync and osyncisdsync. Neither of which - seemingly - makes no difference. >> related to block devices or usage of barriers. For XFS it always >> mounts like this: >> >> SGI XFS with ACLs, security attributes, large block/inode numbers, no debug enabled >> SGI XFS Quota Management subsystem >> XFS mounting filesystem sda6 > > So barriers are being issued. They _are_ being issued, I knew it from the start. What I asked several times is if there's a way to know if they're _hitting_ the actual low-level device (disk or raid controller). This is entirely different story... ;) >> and for the device in question, it is always like >> >> Adaptec aacraid driver 1.1-5[2456]-ms >> aacraid 0000:03:01.0: PCI INT A -> GSI 24 (level, low) -> IRQ 24 >> AAC0: kernel 5.1-0[8832] Feb 1 2006 > > Old firmware. An update might help. Well, it worked just fine in .27. So far I see some problem in kernel, not in controller [firmware]... ;) Thank you ! /mjt From akpm@linux-foundation.org Wed Jun 9 16:07:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_ATTENTION autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o59L7qjV032559 for ; Wed, 9 Jun 2010 16:07:52 -0500 X-ASG-Debug-ID: 1276118005-02be020e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp1.linux-foundation.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 092231591969 for ; Wed, 9 Jun 2010 14:13:25 -0700 (PDT) Received: from smtp1.linux-foundation.org (smtp1.linux-foundation.org [140.211.169.13]) by cuda.sgi.com with ESMTP id VqIGzDJB85EnA6MM for ; Wed, 09 Jun 2010 14:13:25 -0700 (PDT) Received: from imap1.linux-foundation.org (imap1.linux-foundation.org [140.211.169.55]) by smtp1.linux-foundation.org (8.14.2/8.13.5/Debian-3ubuntu1.1) with ESMTP id o59L9hBF024583 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 9 Jun 2010 14:09:44 -0700 Received: from akpm.mtv.corp.google.com (localhost [127.0.0.1]) by imap1.linux-foundation.org (8.13.5.20060308/8.13.5/Debian-3ubuntu1.1) with SMTP id o59L9h2U021764; Wed, 9 Jun 2010 14:09:43 -0700 Date: Wed, 9 Jun 2010 14:09:42 -0700 From: Andrew Morton To: Dave Chinner Cc: torvalds@linux-foundation.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, stable@kernel.org X-ASG-Orig-Subj: Re: [PATCH 1/3] writeback: pay attention to wbc->nr_to_write in write_cache_pages Subject: Re: [PATCH 1/3] writeback: pay attention to wbc->nr_to_write in write_cache_pages Message-Id: <20100609140942.6799c84a.akpm@linux-foundation.org> In-Reply-To: <1276043840-1946-2-git-send-email-david@fromorbit.com> References: <1276043840-1946-1-git-send-email-david@fromorbit.com> <1276043840-1946-2-git-send-email-david@fromorbit.com> X-Mailer: Sylpheed 2.4.8 (GTK+ 2.12.9; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: lf$Revision: 1.188 $ X-Scanned-By: MIMEDefang 2.63 on 140.211.169.13 X-Barracuda-Connect: smtp1.linux-foundation.org[140.211.169.13] X-Barracuda-Start-Time: 1276118007 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32083 Rule breakdown below pts rule 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, 9 Jun 2010 10:37:18 +1000 Dave Chinner wrote: > From: Dave Chinner > > If a filesystem writes more than one page in ->writepage, write_cache_pages > fails to notice this and continues to attempt writeback when wbc->nr_to_write > has gone negative - this trace was captured from XFS: > > > wbc_writeback_start: towrt=1024 > wbc_writepage: towrt=1024 > wbc_writepage: towrt=0 > wbc_writepage: towrt=-1 > wbc_writepage: towrt=-5 > wbc_writepage: towrt=-21 > wbc_writepage: towrt=-85 > > This has adverse effects on filesystem writeback behaviour. write_cache_pages() > needs to terminate after a certain number of pages are written, not after a > certain number of calls to ->writepage are made. This is a regression > introduced by 17bc6c30cf6bfffd816bdc53682dd46fc34a2cf4 ("vfs: Add > no_nrwrite_index_update writeback control flag"), but cannot be reverted > directly due to subsequent bug fixes that have gone in on top of it. Might be needed in -stable. Unfortunately the most important piece of information which is needed to make that decision was cunningly hidden from us behind the vague-to-the-point-of-uselessness term "adverse effects". _what_ "adverse effects"?? From akpm@linux-foundation.org Wed Jun 9 16:08:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o59L8ShX032601 for ; Wed, 9 Jun 2010 16:08:28 -0500 X-ASG-Debug-ID: 1276118043-0a6001ae0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp1.linux-foundation.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id AFE071591985 for ; Wed, 9 Jun 2010 14:14:03 -0700 (PDT) Received: from smtp1.linux-foundation.org (smtp1.linux-foundation.org [140.211.169.13]) by cuda.sgi.com with ESMTP id lvualAShKuyTzayy for ; Wed, 09 Jun 2010 14:14:03 -0700 (PDT) Received: from imap1.linux-foundation.org (imap1.linux-foundation.org [140.211.169.55]) by smtp1.linux-foundation.org (8.14.2/8.13.5/Debian-3ubuntu1.1) with ESMTP id o59LAQKB024673 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 9 Jun 2010 14:10:27 -0700 Received: from akpm.mtv.corp.google.com (localhost [127.0.0.1]) by imap1.linux-foundation.org (8.13.5.20060308/8.13.5/Debian-3ubuntu1.1) with SMTP id o59LAQRM021793; Wed, 9 Jun 2010 14:10:26 -0700 Date: Wed, 9 Jun 2010 14:10:26 -0700 From: Andrew Morton To: Dave Chinner Cc: torvalds@linux-foundation.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, stable@kernel.org X-ASG-Orig-Subj: Re: [PATCH 2/3] xfs: remove nr_to_write writeback windup. Subject: Re: [PATCH 2/3] xfs: remove nr_to_write writeback windup. Message-Id: <20100609141026.977baebf.akpm@linux-foundation.org> In-Reply-To: <1276043840-1946-3-git-send-email-david@fromorbit.com> References: <1276043840-1946-1-git-send-email-david@fromorbit.com> <1276043840-1946-3-git-send-email-david@fromorbit.com> X-Mailer: Sylpheed 2.4.8 (GTK+ 2.12.9; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: lf$Revision: 1.188 $ X-Scanned-By: MIMEDefang 2.63 on 140.211.169.13 X-Barracuda-Connect: smtp1.linux-foundation.org[140.211.169.13] X-Barracuda-Start-Time: 1276118043 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32083 Rule breakdown below pts rule 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, 9 Jun 2010 10:37:19 +1000 Dave Chinner wrote: > From: Dave Chinner > > Now that the background flush code has been fixed, we shouldn't need to > silently multiply the wbc->nr_to_write to get good writeback. Remove > that code. > And anyone who merges [1/3] will want to merge this. Otherwise they might suffer adverse effects ;) From akpm@linux-foundation.org Wed Jun 9 16:10:10 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o59LAAUs032677 for ; Wed, 9 Jun 2010 16:10:10 -0500 X-ASG-Debug-ID: 1276118145-0a1501ba0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp1.linux-foundation.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id AD51815919C6 for ; Wed, 9 Jun 2010 14:15:45 -0700 (PDT) Received: from smtp1.linux-foundation.org (smtp1.linux-foundation.org [140.211.169.13]) by cuda.sgi.com with ESMTP id UEeOcOHFSbEFW85X for ; Wed, 09 Jun 2010 14:15:45 -0700 (PDT) Received: from imap1.linux-foundation.org (imap1.linux-foundation.org [140.211.169.55]) by smtp1.linux-foundation.org (8.14.2/8.13.5/Debian-3ubuntu1.1) with ESMTP id o59LC8aJ024935 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 9 Jun 2010 14:12:09 -0700 Received: from akpm.mtv.corp.google.com (localhost [127.0.0.1]) by imap1.linux-foundation.org (8.13.5.20060308/8.13.5/Debian-3ubuntu1.1) with SMTP id o59LC8Yu021940; Wed, 9 Jun 2010 14:12:08 -0700 Date: Wed, 9 Jun 2010 14:12:08 -0700 From: Andrew Morton To: Dave Chinner Cc: torvalds@linux-foundation.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, stable@kernel.org X-ASG-Orig-Subj: Re: [PATCH 3/3] writeback: limit write_cache_pages integrity scanning to current EOF Subject: Re: [PATCH 3/3] writeback: limit write_cache_pages integrity scanning to current EOF Message-Id: <20100609141208.a1babcf4.akpm@linux-foundation.org> In-Reply-To: <1276043840-1946-4-git-send-email-david@fromorbit.com> References: <1276043840-1946-1-git-send-email-david@fromorbit.com> <1276043840-1946-4-git-send-email-david@fromorbit.com> X-Mailer: Sylpheed 2.4.8 (GTK+ 2.12.9; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-MIMEDefang-Filter: lf$Revision: 1.188 $ X-Scanned-By: MIMEDefang 2.63 on 140.211.169.13 X-Barracuda-Connect: smtp1.linux-foundation.org[140.211.169.13] X-Barracuda-Start-Time: 1276118145 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32083 Rule breakdown below pts rule 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, 9 Jun 2010 10:37:20 +1000 Dave Chinner wrote: > From: Dave Chinner > > sync can currently take a really long time if a concurrent writer is > extending a file. The problem is that the dirty pages on the address > space grow in the same direction as write_cache_pages scans, so if > the writer keeps ahead of writeback, the writeback will not > terminate until the writer stops adding dirty pages. > > For a data integrity sync, we only need to write the pages dirty at > the time we start the writeback, so we can stop scanning once we get > to the page that was at the end of the file at the time the scan > started. > > This will prevent operations like copying a large file preventing > sync from completing as it will not write back pages that were > dirtied after the sync was started. This does not impact the > existing integrity guarantees, as any dirty page (old or new) > within the EOF range at the start of the scan will still be > captured. > > This patch will not prevent sync from blocking on large writes into > holes. That requires more complex intervention while this patch only > addresses the common append-case of this sync holdoff. > I don't know if this regression sucks enough to warrant backporting, but the fix is simple and is independent of [1/3] and [2/3]. From SRS0+GmJu+9+fromorbit.com=david@internode.on.net Wed Jun 9 17:55:41 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_ATTENTION autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o59Mte9Y037138 for ; Wed, 9 Jun 2010 17:55:41 -0500 X-ASG-Debug-ID: 1276124291-5e7703050000-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 F3CB01B6D867 for ; Wed, 9 Jun 2010 15:58:11 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id GVdX0hdUboemXIKj for ; Wed, 09 Jun 2010 15:58:11 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27493122-1927428 for multiple; Thu, 10 Jun 2010 08:28:07 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OMUDl-0004nV-0B; Thu, 10 Jun 2010 08:58:05 +1000 Date: Thu, 10 Jun 2010 08:58:04 +1000 From: Dave Chinner To: Andrew Morton Cc: torvalds@linux-foundation.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, stable@kernel.org X-ASG-Orig-Subj: Re: [PATCH 1/3] writeback: pay attention to wbc->nr_to_write in write_cache_pages Subject: Re: [PATCH 1/3] writeback: pay attention to wbc->nr_to_write in write_cache_pages Message-ID: <20100609225804.GK7869@dastard> References: <1276043840-1946-1-git-send-email-david@fromorbit.com> <1276043840-1946-2-git-send-email-david@fromorbit.com> <20100609140942.6799c84a.akpm@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100609140942.6799c84a.akpm@linux-foundation.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1276124293 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32089 Rule breakdown below pts rule 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, Jun 09, 2010 at 02:09:42PM -0700, Andrew Morton wrote: > On Wed, 9 Jun 2010 10:37:18 +1000 > Dave Chinner wrote: > > > From: Dave Chinner > > > > If a filesystem writes more than one page in ->writepage, write_cache_pages > > fails to notice this and continues to attempt writeback when wbc->nr_to_write > > has gone negative - this trace was captured from XFS: > > > > > > wbc_writeback_start: towrt=1024 > > wbc_writepage: towrt=1024 > > wbc_writepage: towrt=0 > > wbc_writepage: towrt=-1 > > wbc_writepage: towrt=-5 > > wbc_writepage: towrt=-21 > > wbc_writepage: towrt=-85 > > > > This has adverse effects on filesystem writeback behaviour. write_cache_pages() > > needs to terminate after a certain number of pages are written, not after a > > certain number of calls to ->writepage are made. This is a regression > > introduced by 17bc6c30cf6bfffd816bdc53682dd46fc34a2cf4 ("vfs: Add > > no_nrwrite_index_update writeback control flag"), but cannot be reverted > > directly due to subsequent bug fixes that have gone in on top of it. > > Might be needed in -stable. Unfortunately the most important piece of > information which is needed to make that decision was cunningly hidden > from us behind the vague-to-the-point-of-uselessness term "adverse > effects". > > _what_ "adverse effects"?? Depends on how the specific filesystem handles a negative nr_to_write, doesn't it? I can't speak for the exact effect on anything other than XFS except to say that most ->write_page implemetnations don't handle the wbc->nr_to_write < 0 specifically... For XFS, it results in increased CPU usage because it triggers page-at-a-time allocation (i.e no clustering), which increases overhead in the elveator due to merging requirements of single page bios and increased fragmentation due to small interleaved allocations on concurrent writeback workloads. Effectively it causes accelerated aging of XFS filesystems... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+0ds4+10+fromorbit.com=david@internode.on.net Wed Jun 9 19:05:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,SUBJ_ATTENTION autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5A05oAI040652 for ; Wed, 9 Jun 2010 19:05:51 -0500 X-ASG-Debug-ID: 1276128501-727803220000-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 D600B3B86CC for ; Wed, 9 Jun 2010 17:08:21 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id NIh2uifdLeN1oujS for ; Wed, 09 Jun 2010 17:08:21 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27502047-1927428 for multiple; Thu, 10 Jun 2010 09:38:14 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OMVJb-0004rb-Jj; Thu, 10 Jun 2010 10:08:11 +1000 Date: Thu, 10 Jun 2010 10:08:11 +1000 From: Dave Chinner To: Andrew Morton Cc: torvalds@linux-foundation.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, stable@kernel.org X-ASG-Orig-Subj: Re: [PATCH 1/3] writeback: pay attention to wbc->nr_to_write in write_cache_pages Subject: Re: [PATCH 1/3] writeback: pay attention to wbc->nr_to_write in write_cache_pages Message-ID: <20100610000811.GL7869@dastard> References: <1276043840-1946-1-git-send-email-david@fromorbit.com> <1276043840-1946-2-git-send-email-david@fromorbit.com> <20100609140942.6799c84a.akpm@linux-foundation.org> <20100609225804.GK7869@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100609225804.GK7869@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1276128502 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32093 Rule breakdown below pts rule 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, Jun 10, 2010 at 08:58:04AM +1000, Dave Chinner wrote: > On Wed, Jun 09, 2010 at 02:09:42PM -0700, Andrew Morton wrote: > > On Wed, 9 Jun 2010 10:37:18 +1000 > > Dave Chinner wrote: > > > > > From: Dave Chinner > > > > > > If a filesystem writes more than one page in ->writepage, write_cache_pages > > > fails to notice this and continues to attempt writeback when wbc->nr_to_write > > > has gone negative - this trace was captured from XFS: > > > > > > > > > wbc_writeback_start: towrt=1024 > > > wbc_writepage: towrt=1024 > > > wbc_writepage: towrt=0 > > > wbc_writepage: towrt=-1 > > > wbc_writepage: towrt=-5 > > > wbc_writepage: towrt=-21 > > > wbc_writepage: towrt=-85 > > > > > > This has adverse effects on filesystem writeback behaviour. write_cache_pages() > > > needs to terminate after a certain number of pages are written, not after a > > > certain number of calls to ->writepage are made. This is a regression > > > introduced by 17bc6c30cf6bfffd816bdc53682dd46fc34a2cf4 ("vfs: Add > > > no_nrwrite_index_update writeback control flag"), but cannot be reverted > > > directly due to subsequent bug fixes that have gone in on top of it. > > > > Might be needed in -stable. Unfortunately the most important piece of > > information which is needed to make that decision was cunningly hidden > > from us behind the vague-to-the-point-of-uselessness term "adverse > > effects". > > > > _what_ "adverse effects"?? > > Depends on how the specific filesystem handles a negative > nr_to_write, doesn't it? I can't speak for the exact effect on > anything other than XFS except to say that most ->write_page > implemetnations don't handle the wbc->nr_to_write < 0 specifically... > > For XFS, it results in increased CPU usage because it triggers > page-at-a-time allocation (i.e no clustering), which increases > overhead in the elveator due to merging requirements of single page > bios and increased fragmentation due to small interleaved > allocations on concurrent writeback workloads. Effectively it causes > accelerated aging of XFS filesystems... Sorry, forgot to address the -stable part of the question. This series is dependent on the ext4 change to use it's own writepage going into -stable first. (i.e. 8e48dcfbd7c0892b4cfd064d682cc4c95a29df32 "ext4: Use our own write_cache_pages()"). I'd suggest that all 4 patches (the ext4 patch and the three in this series) should go back to 2.6.34-stable due to the long term affect this writeback bug could have on XFS filesystems, and the sync taking too long problem has been fairly widely reported since at least .32... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+jHpW+10+fromorbit.com=david@internode.on.net Wed Jun 9 19:44:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5A0iXZE042216 for ; Wed, 9 Jun 2010 19:44:33 -0500 X-ASG-Debug-ID: 1276130824-4cc7010f0000-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 EF64714AFEFE for ; Wed, 9 Jun 2010 17:47:04 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id wGkgZzGQRTojSE09 for ; Wed, 09 Jun 2010 17:47:04 -0700 (PDT) Received: from dastard (unverified [121.44.131.110]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27229243-1927428 for multiple; Thu, 10 Jun 2010 10:17:03 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OMVvB-0004tx-U6; Thu, 10 Jun 2010 10:47:01 +1000 Date: Thu, 10 Jun 2010 10:47:01 +1000 From: Dave Chinner To: Michael Tokarev Cc: Linux-kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs, 2.6.27=>.32 sync write 10 times slowdown [was: xfs, aacraid 2.6.27 => 2.6.32 results in 6 times slowdown] Subject: Re: xfs, 2.6.27=>.32 sync write 10 times slowdown [was: xfs, aacraid 2.6.27 => 2.6.32 results in 6 times slowdown] Message-ID: <20100610004701.GN7869@dastard> References: <4C0E13A7.20402@msgid.tls.msk.ru> <20100608122919.GC7869@dastard> <4C0EA938.9000104@msgid.tls.msk.ru> <20100608231845.GG7869@dastard> <4C0F3819.4000409@msgid.tls.msk.ru> <20100609074741.GJ7869@dastard> <4C0FE779.8010603@msgid.tls.msk.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C0FE779.8010603@msgid.tls.msk.ru> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1276130825 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32095 Rule breakdown below pts rule 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, Jun 09, 2010 at 11:11:53PM +0400, Michael Tokarev wrote: > 09.06.2010 11:47, Dave Chinner wrote: > >On Wed, Jun 09, 2010 at 10:43:37AM +0400, Michael Tokarev wrote: > >>09.06.2010 03:18, Dave Chinner wrote: > >>>On Wed, Jun 09, 2010 at 12:34:00AM +0400, Michael Tokarev wrote: > >>[] > >>>>Simple test doing random reads or writes of 4k blocks in a 1Gb > >>>>file located on an xfs filesystem, Mb/sec: > >>>> > >>>> sync direct > >>>> read write write > >>>>2.6.27 xfs 1.17 3.69 3.80 > >>>>2.6.32 xfs 1.26 0.52 5.10 > >>>> ^^^^ > >>>>2.6.32 ext3 1.19 4.91 5.02 > > > >Out of curiousity, what does 2.6.34 get on this workload? > > 2.6.34 works quite well: > 2.6.34 xfs 1.14 4.75 5.00 Ok, so we are looking at a fixed regression, then. What stable version of 2.6.32 are you testing? A large number of XFS fixes went into 2.6.32.12 (IIRC, it might have been .13), so maybe the problem is fixed there. Alternatively, can you use 2.6.34 rather than 2.6.32, or bisect the regression down to a specific set of fixes so we can consider whether a backport is worth the effort? > The same is with -o osyncisosync (in .34). Actually, > osyncis[od]sync mount options does not change anything, not > in .32 nor in .34. I think only osyncisosync exists, and it doesn't do anything anymore. Cheers, Dave. -- Dave Chinner david@fromorbit.com From mjt@tls.msk.ru Thu Jun 10 00:56:48 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5A5um9d056874 for ; Thu, 10 Jun 2010 00:56:48 -0500 X-ASG-Debug-ID: 1276149560-562302500000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from isrv.corpit.ru (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7271D3B9345 for ; Wed, 9 Jun 2010 22:59:20 -0700 (PDT) Received: from isrv.corpit.ru (isrv.corpit.ru [81.13.33.159]) by cuda.sgi.com with ESMTP id cSf2scIOHM9xLPdT for ; Wed, 09 Jun 2010 22:59:20 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from [192.168.88.2] (mjt.vpn.tls.msk.ru [192.168.10.88]) by isrv.corpit.ru (Postfix) with ESMTP id 713FB41609; Thu, 10 Jun 2010 09:59:19 +0400 (MSD) (envelope-from mjt@tls.msk.ru) Message-ID: <4C107F36.4070000@msgid.tls.msk.ru> Date: Thu, 10 Jun 2010 09:59:18 +0400 From: Michael Tokarev Organization: Telecom Service, JSC User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.9) Gecko/20100411 Icedove/3.0.4 MIME-Version: 1.0 To: Dave Chinner CC: Linux-kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs, 2.6.27=>.32 sync write 10 times slowdown [was: xfs, aacraid 2.6.27 => 2.6.32 results in 6 times slowdown] Subject: Re: xfs, 2.6.27=>.32 sync write 10 times slowdown [was: xfs, aacraid 2.6.27 => 2.6.32 results in 6 times slowdown] References: <4C0E13A7.20402@msgid.tls.msk.ru> <20100608122919.GC7869@dastard> <4C0EA938.9000104@msgid.tls.msk.ru> <20100608231845.GG7869@dastard> <4C0F3819.4000409@msgid.tls.msk.ru> <20100609074741.GJ7869@dastard> <4C0FE779.8010603@msgid.tls.msk.ru> <20100610004701.GN7869@dastard> In-Reply-To: <20100610004701.GN7869@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: isrv.corpit.ru[81.13.33.159] X-Barracuda-Start-Time: 1276149561 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 10.06.2010 04:47, Dave Chinner wrote: > On Wed, Jun 09, 2010 at 11:11:53PM +0400, Michael Tokarev wrote: >> 09.06.2010 11:47, Dave Chinner wrote: >>> On Wed, Jun 09, 2010 at 10:43:37AM +0400, Michael Tokarev wrote: >>>> 09.06.2010 03:18, Dave Chinner wrote: >>>>> On Wed, Jun 09, 2010 at 12:34:00AM +0400, Michael Tokarev wrote: >>>> [] >>>>>> Simple test doing random reads or writes of 4k blocks in a 1Gb >>>>>> file located on an xfs filesystem, Mb/sec: >>>>>> >>>>>> sync direct >>>>>> read write write >>>>>> 2.6.27 xfs 1.17 3.69 3.80 >>>>>> 2.6.32 xfs 1.26 0.52 5.10 >>>>>> ^^^^ >>>>>> 2.6.32 ext3 1.19 4.91 5.02 >>> >>> Out of curiousity, what does 2.6.34 get on this workload? >> >> 2.6.34 works quite well: >> 2.6.34 xfs 1.14 4.75 5.00 > > Ok, so we are looking at a fixed regression, then. What stable > version of 2.6.32 are you testing? A large number of XFS fixes went > into 2.6.32.12 (IIRC, it might have been .13), so maybe the problem > is fixed there. Alternatively, can you use 2.6.34 rather than > 2.6.32, or bisect the regression down to a specific set of fixes so > we can consider whether a backport is worth the effort? I tried 2.6.32.15. A few previous versions too, but all recent testing were with 2.6.32.15. So no, the fix is not in 2.6.32.y yet, since .15 is the latest currently. Too bad it'd be very difficult for me to do any bisection, -- users are not comfortable at all already due to all my experiments, -- f.e. their reports that are collecting for whole night stopped working completely since a few days ago (because every night I'm rebooting the machine). Yes it'd be nice to have this fixed in 2.6.32.y. And I promise I'll try to find time for bisection (but not promise the tries will be successful... ;). Definitely worth a try anyway. Thank you! /mjt From jack@suse.cz Thu Jun 10 05:56:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5AAu2BK070073 for ; Thu, 10 Jun 2010 05:56:02 -0500 X-ASG-Debug-ID: 1276167514-62c800ed0000-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 A7B461D57D28 for ; Thu, 10 Jun 2010 03:58:35 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id JhUREZhy9ZObRo1n for ; Thu, 10 Jun 2010 03:58:35 -0700 (PDT) Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id BA4C65FC9F; Thu, 10 Jun 2010 12:58:33 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 4AE012B1BBF; Thu, 10 Jun 2010 12:58:14 +0200 (CEST) Date: Thu, 10 Jun 2010 12:58:14 +0200 From: Jan Kara To: Eric Sandeen Cc: Jan Kara , xfs@oss.sgi.com, hch@infradead.org X-ASG-Orig-Subj: Re: [PATCH 4/8] Add test of quota accounting using fsx Subject: Re: [PATCH 4/8] Add test of quota accounting using fsx Message-ID: <20100610105813.GB10827@quack.suse.cz> References: <1274710459-11446-1-git-send-email-jack@suse.cz> <1274710459-11446-5-git-send-email-jack@suse.cz> <4C0FD43D.3040803@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C0FD43D.3040803@sandeen.net> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1276167515 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32136 Rule breakdown below pts rule 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 09-06-10 12:49:49, Eric Sandeen wrote: > Jan Kara wrote: > > Run fsx (and also several fsx threads in parallel) and verify that > > quota accounting is correct after they finish. > > Jan, I'm having trouble with this one on XFS for some reason, with our > RHEL6 kernel and quota-3.17... > > +Disabling group quota enforcement and accounting on /dev/mapper/VolGroup00-testvol2 > +Disabling user quota enforcement and accounting on /dev/mapper/VolGroup00-testvol2 > +repquota: Mountpoint (or device) /mnt/testarea/scratch not found or has no quota enabled. > +repquota: Not all specified mountpoints are using quota. > +repquota: Mountpoint (or device) /mnt/testarea/scratch not found or has no quota enabled. > +repquota: Not all specified mountpoints are using quota. > > ... > > however if I remove the quotaon calls (off / on settings) in check_usage() > then it works: > > check_usage() > { > # quotaon -f -u -g $SCRATCH_MNT 2>/dev/null > repquota -u -g $SCRATCH_MNT | grep -v "^root" | filter_scratch \ > >$tmp.orig > quotacheck -u -g $SCRATCH_MNT 2>/dev/null > repquota -u -g $SCRATCH_MNT | grep -v "^root" | filter_scratch \ > >$tmp.checked > # quotaon -u -g $SCRATCH_MNT 2>/dev/null > diff $tmp.orig $tmp.checked > } > > > Seems like 2 issues: noisy disable messages, and repquota failing when disabled. I've fixed noisy disable messages in quotaon (without -v flag only errors should be printed) in CVS. With repquota & disabled quotas it's a bit more complicated. The problem is that for ext?, reiserfs,... you have to disable quotas before running quotacheck. Also quotacheck is NOP for XFS - we'd rather need to call something to really recompute quota usage for XFS. How that can be done? Honza -- Jan Kara SUSE Labs, CR From michael.monnerie@is.it-management.at Thu Jun 10 06:03:41 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5AB3eAt070413 for ; Thu, 10 Jun 2010 06:03:41 -0500 X-ASG-Debug-ID: 1276168156-679e02170000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0A45510DEE79 for ; Thu, 10 Jun 2010 04:09:16 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id X3qHg4H1NVpToiwZ for ; Thu, 10 Jun 2010 04:09:16 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 6342C400 for ; Thu, 10 Jun 2010 13:06:09 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 98D9783C804 for ; Thu, 10 Jun 2010 13:06:08 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: "xfs-oss" X-ASG-Orig-Subj: xfs_repair 3.1.2 crashing Subject: xfs_repair 3.1.2 crashing Date: Thu, 10 Jun 2010 13:06:07 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) MIME-Version: 1.0 Message-Id: <201006101306.07587@zmi.at> Content-Type: multipart/signed; boundary="nextPart1330499.8yamHWJK84"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1276168158 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart1330499.8yamHWJK84 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Dear devs, I have a massive problem with a filesystem in our internal=20 server. We've had an overheating problem with the RAID controller CPU,=20 as it's very hot here and aircondition was turn off... the system "just"=20 stopped working. This is a XenServer with some Linuxen on it, and one of=20 them (of course our main server :-) reports this on xfs_repair: Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - process known inodes and perform inode discovery... - agno =3D 0 - agno =3D 1 local inode 2267035928 attr too small (size =3D 3, min size =3D 4) bad attribute fork in inode 2267035928, clearing attr fork clearing inode 2267035928 attributes cleared inode 2267035928 - agno =3D 2 - agno =3D 3 - agno =3D 4 - agno =3D 5 - agno =3D 6 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno =3D 0 - agno =3D 2 - agno =3D 1 data fork in regular inode 2267035928 claims used block 537158068 xfs_repair: dinode.c:2101: process_inode_data_fork: Assertion `err =3D=3D 0= '=20 failed. Any ideas? Before that, I had 3.0.3 installed, it found tons of errors before also=20 crashing. I'll send that log later. =2D-=20 mit freundlichen Gr=C3=BCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=C3=A4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart1330499.8yamHWJK84 Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkwQxx8ACgkQzhSR9xwSCbTnaACgiMsTakowJQTkyJZFOfroe/YC tWYAoOLOBla8HjNo5b0HR2c/paAXkG0I =Uq3N -----END PGP SIGNATURE----- --nextPart1330499.8yamHWJK84-- From andi@firstfloor.org Thu Jun 10 06:08:26 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.3 required=5.0 tests=BAYES_00,J_CHICKENPOX_62, J_CHICKENPOX_63,J_CHICKENPOX_64,J_CHICKENPOX_65,J_CHICKENPOX_73, J_CHICKENPOX_74,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5AB8Ox7070656 for ; Thu, 10 Jun 2010 06:08:26 -0500 X-ASG-Debug-ID: 1276168254-41c602390000-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 D89991D58072 for ; Thu, 10 Jun 2010 04:10:55 -0700 (PDT) Received: from one.firstfloor.org (one.firstfloor.org [213.235.205.2]) by cuda.sgi.com with ESMTP id bEYjSXGiTZ3J28vr for ; Thu, 10 Jun 2010 04:10:55 -0700 (PDT) Received: from basil.firstfloor.org (p5B3CB6DB.dip0.t-ipconnect.de [91.60.182.219]) by one.firstfloor.org (Postfix) with ESMTP id AAA591EE802A; Thu, 10 Jun 2010 13:10:52 +0200 (CEST) Received: by basil.firstfloor.org (Postfix, from userid 1000) id 3DDC5B1A2B; Thu, 10 Jun 2010 13:10:52 +0200 (CEST) From: Andi Kleen References: <20100610110.764742110@firstfloor.org> In-Reply-To: <20100610110.764742110@firstfloor.org> To: xfs@oss.sgi.com, akpm@linux-foundation.org, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: [PATCH] [16/23] XFS: Fix gcc 4.6 set but not read and unused statement warnings Subject: [PATCH] [16/23] XFS: Fix gcc 4.6 set but not read and unused statement warnings Message-Id: <20100610111052.3DDC5B1A2B@basil.firstfloor.org> Date: Thu, 10 Jun 2010 13:10:52 +0200 (CEST) X-Barracuda-Connect: one.firstfloor.org[213.235.205.2] X-Barracuda-Start-Time: 1276168255 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32136 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean For my configuration, that is without quota or RT. Mostly dead code removed I think (but needs additional review) That is there were one or two bad error handling cases, but they were not easily fixable, with comments and I left the warnings in for those for you to remember. e.g. if there is a ENOSPC down in xfs_trans.c while modifying the superblock it would not be handled. Unused statements were mostly related to stub macros for disabled features like QUOTA or RT ALLOC. I replace those with inlines. There were also some problems with variables used in ASSERT() I partly moved those into the ASSERT itself and partly used a new QASSERT that always evaluates. Cc: xfs@oss.sgi.com Signed-off-by: Andi Kleen --- fs/xfs/linux-2.6/xfs_sync.c | 3 +++ fs/xfs/support/debug.h | 4 ++++ fs/xfs/xfs_alloc.c | 10 +++------- fs/xfs/xfs_da_btree.c | 15 +++++---------- fs/xfs/xfs_dir2_block.c | 6 +++--- fs/xfs/xfs_filestream.c | 10 ++-------- fs/xfs/xfs_iget.c | 3 --- fs/xfs/xfs_inode.c | 4 ---- fs/xfs/xfs_inode_item.c | 8 ++------ fs/xfs/xfs_log.c | 2 -- fs/xfs/xfs_quota.h | 14 ++++++++++---- fs/xfs/xfs_trans.c | 1 + 12 files changed, 33 insertions(+), 47 deletions(-) Index: linux-2.6.35-rc2-gcc/fs/xfs/linux-2.6/xfs_sync.c =================================================================== --- linux-2.6.35-rc2-gcc.orig/fs/xfs/linux-2.6/xfs_sync.c +++ linux-2.6.35-rc2-gcc/fs/xfs/linux-2.6/xfs_sync.c @@ -554,6 +554,9 @@ xfs_sync_worker( xfs_log_force(mp, 0); xfs_reclaim_inodes(mp, 0); /* dgc: errors ignored here */ + /* ak: yes and you'll get a warning for it now when you + * upgrade compilers. + */ error = xfs_qm_sync(mp, SYNC_TRYLOCK); if (xfs_log_need_covered(mp)) error = xfs_commit_dummy_trans(mp, 0); Index: linux-2.6.35-rc2-gcc/fs/xfs/xfs_da_btree.c =================================================================== --- linux-2.6.35-rc2-gcc.orig/fs/xfs/xfs_da_btree.c +++ linux-2.6.35-rc2-gcc/fs/xfs/xfs_da_btree.c @@ -581,10 +581,8 @@ xfs_da_node_add(xfs_da_state_t *state, x xfs_da_intnode_t *node; xfs_da_node_entry_t *btree; int tmp; - xfs_mount_t *mp; node = oldblk->bp->data; - mp = state->mp; ASSERT(be16_to_cpu(node->hdr.info.magic) == XFS_DA_NODE_MAGIC); ASSERT((oldblk->index >= 0) && (oldblk->index <= be16_to_cpu(node->hdr.count))); ASSERT(newblk->blkno != 0); @@ -710,8 +708,6 @@ STATIC int xfs_da_root_join(xfs_da_state_t *state, xfs_da_state_blk_t *root_blk) { xfs_da_intnode_t *oldroot; - /* REFERENCED */ - xfs_da_blkinfo_t *blkinfo; xfs_da_args_t *args; xfs_dablk_t child; xfs_dabuf_t *bp; @@ -742,15 +738,14 @@ xfs_da_root_join(xfs_da_state_t *state, if (error) return(error); ASSERT(bp != NULL); - blkinfo = bp->data; if (be16_to_cpu(oldroot->hdr.level) == 1) { - ASSERT(be16_to_cpu(blkinfo->magic) == XFS_DIR2_LEAFN_MAGIC || - be16_to_cpu(blkinfo->magic) == XFS_ATTR_LEAF_MAGIC); + ASSERT(be16_to_cpu(bp->data->magic) == XFS_DIR2_LEAFN_MAGIC || + be16_to_cpu(bp->data->magic) == XFS_ATTR_LEAF_MAGIC); } else { - ASSERT(be16_to_cpu(blkinfo->magic) == XFS_DA_NODE_MAGIC); + ASSERT(be16_to_cpu(bp->data->magic) == XFS_DA_NODE_MAGIC); } - ASSERT(!blkinfo->forw); - ASSERT(!blkinfo->back); + ASSERT(!bp->data->forw); + ASSERT(!bp->data->back); memcpy(root_blk->bp->data, bp->data, state->blocksize); xfs_da_log_buf(args->trans, root_blk->bp, 0, state->blocksize - 1); error = xfs_da_shrink_inode(args, child, bp); Index: linux-2.6.35-rc2-gcc/fs/xfs/xfs_dir2_block.c =================================================================== --- linux-2.6.35-rc2-gcc.orig/fs/xfs/xfs_dir2_block.c +++ linux-2.6.35-rc2-gcc/fs/xfs/xfs_dir2_block.c @@ -1073,10 +1073,10 @@ xfs_dir2_sf_to_block( */ buf_len = dp->i_df.if_bytes; - buf = kmem_alloc(dp->i_df.if_bytes, KM_SLEEP); + buf = kmem_alloc(buf_len, KM_SLEEP); - memcpy(buf, sfp, dp->i_df.if_bytes); - xfs_idata_realloc(dp, -dp->i_df.if_bytes, XFS_DATA_FORK); + memcpy(buf, sfp, buf_len); + xfs_idata_realloc(dp, -buf_len, XFS_DATA_FORK); dp->i_d.di_size = 0; xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); /* Index: linux-2.6.35-rc2-gcc/fs/xfs/xfs_filestream.c =================================================================== --- linux-2.6.35-rc2-gcc.orig/fs/xfs/xfs_filestream.c +++ linux-2.6.35-rc2-gcc/fs/xfs/xfs_filestream.c @@ -140,9 +140,8 @@ _xfs_filestream_pick_ag( int flags, xfs_extlen_t minlen) { - int streams, max_streams; int err, trylock, nscan; - xfs_extlen_t longest, free, minfree, maxfree = 0; + xfs_extlen_t longest, minfree, maxfree = 0; xfs_agnumber_t ag, max_ag = NULLAGNUMBER; struct xfs_perag *pag; @@ -174,7 +173,6 @@ _xfs_filestream_pick_ag( /* Keep track of the AG with the most free blocks. */ if (pag->pagf_freeblks > maxfree) { maxfree = pag->pagf_freeblks; - max_streams = atomic_read(&pag->pagf_fstrms); max_ag = ag; } @@ -196,8 +194,6 @@ _xfs_filestream_pick_ag( (flags & XFS_PICK_LOWSPACE))) { /* Break out, retaining the reference on the AG. */ - free = pag->pagf_freeblks; - streams = atomic_read(&pag->pagf_fstrms); xfs_perag_put(pag); *agp = ag; break; @@ -234,8 +230,6 @@ next_ag: if (max_ag != NULLAGNUMBER) { xfs_filestream_get_ag(mp, max_ag); TRACE_AG_PICK1(mp, max_ag, maxfree); - streams = max_streams; - free = maxfree; *agp = max_ag; break; } @@ -364,7 +358,7 @@ xfs_fstrm_free_func( /* Drop the reference taken on the AG when the item was added. */ ref = xfs_filestream_put_ag(ip->i_mount, item->ag); - ASSERT(ref >= 0); + QASSERT(ref >= 0); TRACE_FREE(ip->i_mount, ip, item->pip, item->ag, xfs_filestream_peek_ag(ip->i_mount, item->ag)); Index: linux-2.6.35-rc2-gcc/fs/xfs/xfs_iget.c =================================================================== --- linux-2.6.35-rc2-gcc.orig/fs/xfs/xfs_iget.c +++ linux-2.6.35-rc2-gcc/fs/xfs/xfs_iget.c @@ -265,7 +265,6 @@ xfs_iget_cache_miss( { struct xfs_inode *ip; int error; - unsigned long first_index, mask; xfs_agino_t agino = XFS_INO_TO_AGINO(mp, ino); ip = xfs_inode_alloc(mp, ino); @@ -302,8 +301,6 @@ xfs_iget_cache_miss( BUG(); } - mask = ~(((XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog)) - 1); - first_index = agino & mask; write_lock(&pag->pag_ici_lock); /* insert the new inode */ Index: linux-2.6.35-rc2-gcc/fs/xfs/xfs_inode.c =================================================================== --- linux-2.6.35-rc2-gcc.orig/fs/xfs/xfs_inode.c +++ linux-2.6.35-rc2-gcc/fs/xfs/xfs_inode.c @@ -925,7 +925,6 @@ xfs_iread_extents( int error; xfs_ifork_t *ifp; xfs_extnum_t nextents; - size_t size; if (unlikely(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE)) { XFS_ERROR_REPORT("xfs_iread_extents", XFS_ERRLEVEL_LOW, @@ -933,7 +932,6 @@ xfs_iread_extents( return XFS_ERROR(EFSCORRUPTED); } nextents = XFS_IFORK_NEXTENTS(ip, whichfork); - size = nextents * sizeof(xfs_bmbt_rec_t); ifp = XFS_IFORK_PTR(ip, whichfork); /* @@ -3517,13 +3515,11 @@ xfs_iext_remove_indirect( xfs_extnum_t ext_diff; /* extents to remove in current list */ xfs_extnum_t nex1; /* number of extents before idx */ xfs_extnum_t nex2; /* extents after idx + count */ - int nlists; /* entries in indirection array */ int page_idx = idx; /* index in target extent list */ ASSERT(ifp->if_flags & XFS_IFEXTIREC); erp = xfs_iext_idx_to_irec(ifp, &page_idx, &erp_idx, 0); ASSERT(erp != NULL); - nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; nex1 = page_idx; ext_cnt = count; while (ext_cnt) { Index: linux-2.6.35-rc2-gcc/fs/xfs/xfs_inode_item.c =================================================================== --- linux-2.6.35-rc2-gcc.orig/fs/xfs/xfs_inode_item.c +++ linux-2.6.35-rc2-gcc/fs/xfs/xfs_inode_item.c @@ -220,7 +220,6 @@ xfs_inode_item_format( xfs_inode_t *ip; size_t data_bytes; xfs_bmbt_rec_t *ext_buffer; - int nrecs; xfs_mount_t *mp; ip = iip->ili_inode; @@ -323,9 +322,8 @@ xfs_inode_item_format( ASSERT(ip->i_df.if_u1.if_extents != NULL); ASSERT(ip->i_d.di_nextents > 0); ASSERT(iip->ili_extents_buf == NULL); - nrecs = ip->i_df.if_bytes / - (uint)sizeof(xfs_bmbt_rec_t); - ASSERT(nrecs > 0); + ASSERT((ip->i_df.if_bytes / + (uint)sizeof(xfs_bmbt_rec_t)) > 0); #ifdef XFS_NATIVE_HOST if (nrecs == ip->i_d.di_nextents) { /* @@ -957,10 +955,8 @@ xfs_iflush_abort( xfs_inode_t *ip) { xfs_inode_log_item_t *iip = ip->i_itemp; - xfs_mount_t *mp; iip = ip->i_itemp; - mp = ip->i_mount; if (iip) { struct xfs_ail *ailp = iip->ili_item.li_ailp; if (iip->ili_item.li_flags & XFS_LI_IN_AIL) { Index: linux-2.6.35-rc2-gcc/fs/xfs/xfs_log.c =================================================================== --- linux-2.6.35-rc2-gcc.orig/fs/xfs/xfs_log.c +++ linux-2.6.35-rc2-gcc/fs/xfs/xfs_log.c @@ -1047,7 +1047,6 @@ xlog_alloc_log(xfs_mount_t *mp, xlog_in_core_t *iclog, *prev_iclog=NULL; xfs_buf_t *bp; int i; - int iclogsize; int error = ENOMEM; uint log2_size = 0; @@ -1127,7 +1126,6 @@ xlog_alloc_log(xfs_mount_t *mp, * with different amounts of memory. See the definition of * xlog_in_core_t in xfs_log_priv.h for details. */ - iclogsize = log->l_iclog_size; ASSERT(log->l_iclog_size >= 4096); for (i=0; i < log->l_iclog_bufs; i++) { *iclogp = kmem_zalloc(sizeof(xlog_in_core_t), KM_MAYFAIL); Index: linux-2.6.35-rc2-gcc/fs/xfs/xfs_quota.h =================================================================== --- linux-2.6.35-rc2-gcc.orig/fs/xfs/xfs_quota.h +++ linux-2.6.35-rc2-gcc/fs/xfs/xfs_quota.h @@ -346,7 +346,13 @@ xfs_qm_vop_dqalloc(struct xfs_inode *ip, #define xfs_trans_mod_dquot_byino(tp, ip, fields, delta) #define xfs_trans_apply_dquot_deltas(tp) #define xfs_trans_unreserve_and_mod_dquots(tp) -#define xfs_trans_reserve_quota_nblks(tp, ip, nblks, ninos, flags) (0) + +static inline int xfs_trans_reserve_quota_nblks(struct xfs_trans *t, + struct xfs_inode *i, long a, long b, uint c) +{ + return 0; +} + #define xfs_trans_reserve_quota_bydquots(tp, mp, u, g, nb, ni, fl) (0) #define xfs_qm_vop_create_dqattach(tp, ip, u, g) #define xfs_qm_vop_rename_dqattach(it) (0) @@ -355,13 +361,13 @@ xfs_qm_vop_dqalloc(struct xfs_inode *ip, #define xfs_qm_dqattach(ip, fl) (0) #define xfs_qm_dqattach_locked(ip, fl) (0) #define xfs_qm_dqdetach(ip) -#define xfs_qm_dqrele(d) +static inline void xfs_qm_dqrele(struct xfs_dquot *d) {} #define xfs_qm_statvfs(ip, s) -#define xfs_qm_sync(mp, fl) (0) +static inline int xfs_qm_sync(struct xfs_mount *m, int i) { return 0; } #define xfs_qm_newmount(mp, a, b) (0) #define xfs_qm_mount_quotas(mp) #define xfs_qm_unmount(mp) -#define xfs_qm_unmount_quotas(mp) (0) +static inline void xfs_qm_unmount_quotas(struct xfs_mount *m) {} #endif /* CONFIG_XFS_QUOTA */ #define xfs_trans_unreserve_quota_nblks(tp, ip, nblks, ninos, flags) \ Index: linux-2.6.35-rc2-gcc/fs/xfs/xfs_trans.c =================================================================== --- linux-2.6.35-rc2-gcc.orig/fs/xfs/xfs_trans.c +++ linux-2.6.35-rc2-gcc/fs/xfs/xfs_trans.c @@ -1120,6 +1120,7 @@ xfs_trans_unreserve_and_mod_sb( error = xfs_mod_incore_sb_batch(tp->t_mountp, msb, (uint)(msbp - msb), rsvd); ASSERT(error == 0); + /* FIXME: need real error handling here, error can be ENOSPC */ } } Index: linux-2.6.35-rc2-gcc/fs/xfs/xfs_alloc.c =================================================================== --- linux-2.6.35-rc2-gcc.orig/fs/xfs/xfs_alloc.c +++ linux-2.6.35-rc2-gcc/fs/xfs/xfs_alloc.c @@ -688,8 +688,6 @@ xfs_alloc_ag_vextent_near( xfs_agblock_t ltbno; /* start bno of left side entry */ xfs_agblock_t ltbnoa; /* aligned ... */ xfs_extlen_t ltdiff; /* difference to left side entry */ - /*REFERENCED*/ - xfs_agblock_t ltend; /* end bno of left side entry */ xfs_extlen_t ltlen; /* length of left side entry */ xfs_extlen_t ltlena; /* aligned ... */ xfs_agblock_t ltnew; /* useful start bno of left side */ @@ -814,8 +812,7 @@ xfs_alloc_ag_vextent_near( if ((error = xfs_alloc_get_rec(cnt_cur, <bno, <len, &i))) goto error0; XFS_WANT_CORRUPTED_GOTO(i == 1, error0); - ltend = ltbno + ltlen; - ASSERT(ltend <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); + ASSERT(ltbno + ltlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); args->len = blen; if (!xfs_alloc_fix_minleft(args)) { xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); @@ -828,7 +825,7 @@ xfs_alloc_ag_vextent_near( */ args->agbno = bnew; ASSERT(bnew >= ltbno); - ASSERT(bnew + blen <= ltend); + ASSERT(bnew + blen <= ltbno + ltlen); /* * Set up a cursor for the by-bno tree. */ @@ -1157,7 +1154,6 @@ xfs_alloc_ag_vextent_near( /* * Fix up the length and compute the useful address. */ - ltend = ltbno + ltlen; args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen); xfs_alloc_fix_len(args); if (!xfs_alloc_fix_minleft(args)) { @@ -1170,7 +1166,7 @@ xfs_alloc_ag_vextent_near( (void)xfs_alloc_compute_diff(args->agbno, rlen, args->alignment, ltbno, ltlen, <new); ASSERT(ltnew >= ltbno); - ASSERT(ltnew + rlen <= ltend); + ASSERT(ltnew + rlen <= ltbno + ltlen); ASSERT(ltnew + rlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); args->agbno = ltnew; if ((error = xfs_alloc_fixup_trees(cnt_cur, bno_cur_lt, ltbno, ltlen, Index: linux-2.6.35-rc2-gcc/fs/xfs/support/debug.h =================================================================== --- linux-2.6.35-rc2-gcc.orig/fs/xfs/support/debug.h +++ linux-2.6.35-rc2-gcc/fs/xfs/support/debug.h @@ -37,6 +37,9 @@ extern void assfail(char *expr, char *f, #ifndef DEBUG #define ASSERT(expr) ((void)0) +/* Assert that always evaluates its input to avoid warnings */ +#define QASSERT(expr) ((void)(expr)) + #ifndef STATIC # define STATIC static noinline #endif @@ -45,6 +48,7 @@ extern void assfail(char *expr, char *f, #define ASSERT(expr) \ (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) +#define QASSERT(expr) ASSERT(expr) #ifndef STATIC # define STATIC noinline From sandeen@sandeen.net Thu Jun 10 09:55:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5AEtt7h079893 for ; Thu, 10 Jun 2010 09:55:56 -0500 X-ASG-Debug-ID: 1276181907-7b9100da0000-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 9CFC41E0C29F for ; Thu, 10 Jun 2010 07:58:27 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id GYCoFuvuBerqnyTw for ; Thu, 10 Jun 2010 07:58:27 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 860F04968903; Thu, 10 Jun 2010 09:58:26 -0500 (CDT) Message-ID: <4C10FD91.4060209@sandeen.net> Date: Thu, 10 Jun 2010 09:58:25 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: Dave Chinner CC: Michael Tokarev , Linux-kernel , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs, 2.6.27=>.32 sync write 10 times slowdown [was: xfs, aacraid 2.6.27 => 2.6.32 results in 6 times slowdown] Subject: Re: xfs, 2.6.27=>.32 sync write 10 times slowdown [was: xfs, aacraid 2.6.27 => 2.6.32 results in 6 times slowdown] References: <4C0E13A7.20402@msgid.tls.msk.ru> <20100608122919.GC7869@dastard> <4C0EA938.9000104@msgid.tls.msk.ru> <20100608231845.GG7869@dastard> <4C0F3819.4000409@msgid.tls.msk.ru> <20100609074741.GJ7869@dastard> <4C0FE779.8010603@msgid.tls.msk.ru> <20100610004701.GN7869@dastard> In-Reply-To: <20100610004701.GN7869@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1276181908 X-Barracuda-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.32152 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, Jun 09, 2010 at 11:11:53PM +0400, Michael Tokarev wrote: >> The same is with -o osyncisosync (in .34). Actually, >> osyncis[od]sync mount options does not change anything, not >> in .32 nor in .34. > > I think only osyncisosync exists, and it doesn't do anything > anymore. Just to be pedantic, osyncisdsync "exists," but is deprecated and does nothing to change defaults: } else if (!strcmp(this_char, "osyncisdsync")) { /* no-op, this is now the default */ cmn_err(CE_WARN, "XFS: osyncisdsync is now the default, option is deprecated."); } huh, didn't realize that osyncisosync does nothing but set a flag that is never tested other than to show mount options: File Function Line 0 xfs_mount.h 285 #define XFS_MOUNT_OSYNCISOSYNC (1ULL << 13) 1 linux-2.6/xfs_super.c xfs_parseargs 292 mp->m_flags |= XFS_MOUNT_OSYNCISOSYNC; 2 linux-2.6/xfs_super.c xfs_showargs 542 { XFS_MOUNT_OSYNCISOSYNC, "," MNTOPT_OSYNCISOSYNC }, Time to deprecate/remove that one too I guess? -Eric > Cheers, > > Dave. From sandeen@sandeen.net Thu Jun 10 11:25:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5AGP9fr084106 for ; Thu, 10 Jun 2010 11:25:09 -0500 X-ASG-Debug-ID: 1276187261-186701a10000-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 9A9573BB139 for ; Thu, 10 Jun 2010 09:27:42 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id S5EIkekfwaJKQAua for ; Thu, 10 Jun 2010 09:27:42 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 2D3164968903; Thu, 10 Jun 2010 11:27:41 -0500 (CDT) Message-ID: <4C11127C.3030907@sandeen.net> Date: Thu, 10 Jun 2010 11:27:40 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: Michael Monnerie CC: xfs-oss X-ASG-Orig-Subj: Re: xfs_repair 3.1.2 crashing Subject: Re: xfs_repair 3.1.2 crashing References: <201006101306.07587@zmi.at> In-Reply-To: <201006101306.07587@zmi.at> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: 64-131-60-146.usfamily.net[64.131.60.146] X-Barracuda-Start-Time: 1276187262 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.92 X-Barracuda-Spam-Status: No, SCORE=-1.92 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_SA210e, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32158 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.00 BSF_SC5_SA210e Custom Rule SA210e X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Michael Monnerie wrote: > Dear devs, I have a massive problem with a filesystem in our internal > server. We've had an overheating problem with the RAID controller CPU, > as it's very hot here and aircondition was turn off... the system "just" > stopped working. This is a XenServer with some Linuxen on it, and one of > them (of course our main server :-) reports this on xfs_repair: > ... > Phase 4 - check for duplicate blocks... > - setting up duplicate extent list... > - check for inodes claiming duplicate blocks... > - agno = 0 > - agno = 2 > - agno = 1 > data fork in regular inode 2267035928 claims used block 537158068 > xfs_repair: dinode.c:2101: process_inode_data_fork: Assertion `err == 0' > failed. > > Any ideas? It'd be great to at least capture the issue by creating an xfs_metadump image for analysis... -Eric > Before that, I had 3.0.3 installed, it found tons of errors before also > crashing. I'll send that log later. From sandeen@sandeen.net Thu Jun 10 11:48:27 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5AGmRKp085003 for ; Thu, 10 Jun 2010 11:48:27 -0500 X-ASG-Debug-ID: 1276188660-331001360000-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 AC9073BB2EF for ; Thu, 10 Jun 2010 09:51:00 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id QGI5lUteOATQ4imm for ; Thu, 10 Jun 2010 09:51:00 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id C8DBD4968903; Thu, 10 Jun 2010 11:50:59 -0500 (CDT) Message-ID: <4C1117F3.2010008@sandeen.net> Date: Thu, 10 Jun 2010 11:50:59 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: Jan Kara CC: hch@infradead.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/8] Add test of quota accounting using fsx Subject: Re: [PATCH 4/8] Add test of quota accounting using fsx References: <1274710459-11446-1-git-send-email-jack@suse.cz> <1274710459-11446-5-git-send-email-jack@suse.cz> <4C0FD43D.3040803@sandeen.net> <20100610105813.GB10827@quack.suse.cz> In-Reply-To: <20100610105813.GB10827@quack.suse.cz> 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: 1276188660 X-Barracuda-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.32159 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 Jan Kara wrote: > On Wed 09-06-10 12:49:49, Eric Sandeen wrote: >> Jan Kara wrote: >>> Run fsx (and also several fsx threads in parallel) and verify that >>> quota accounting is correct after they finish. >> Jan, I'm having trouble with this one on XFS for some reason, with our >> RHEL6 kernel and quota-3.17... >> >> +Disabling group quota enforcement and accounting on /dev/mapper/VolGroup00-testvol2 >> +Disabling user quota enforcement and accounting on /dev/mapper/VolGroup00-testvol2 >> +repquota: Mountpoint (or device) /mnt/testarea/scratch not found or has no quota enabled. >> +repquota: Not all specified mountpoints are using quota. >> +repquota: Mountpoint (or device) /mnt/testarea/scratch not found or has no quota enabled. >> +repquota: Not all specified mountpoints are using quota. >> >> ... >> >> however if I remove the quotaon calls (off / on settings) in check_usage() >> then it works: >> >> check_usage() >> { >> # quotaon -f -u -g $SCRATCH_MNT 2>/dev/null >> repquota -u -g $SCRATCH_MNT | grep -v "^root" | filter_scratch \ >> >$tmp.orig >> quotacheck -u -g $SCRATCH_MNT 2>/dev/null >> repquota -u -g $SCRATCH_MNT | grep -v "^root" | filter_scratch \ >> >$tmp.checked >> # quotaon -u -g $SCRATCH_MNT 2>/dev/null >> diff $tmp.orig $tmp.checked >> } >> >> >> Seems like 2 issues: noisy disable messages, and repquota failing when disabled. > I've fixed noisy disable messages in quotaon (without -v flag only errors > should be printed) in CVS. Ok, we should probably just add a filter for these so that it'll work on older versions. > With repquota & disabled quotas it's a bit more > complicated. Hm I'm still woefully unfamiliar with quota intricacies. It seems that after quotaon -f, repquota fails on xfs but works for ext*? Not sure if that's intended... Also is there a reason to disable quota before repquota? Is disable/enable around quotacheck enough? Hm on ext* I'm also getting differences from the expected output; I suspect due to selinux xattrs. I'll try to get that fixed up. > The problem is that for ext?, reiserfs,... you have to disable > quotas before running quotacheck. Also quotacheck is NOP for XFS - we'd > rather need to call something to really recompute quota usage for XFS. How > that can be done? It's regenerated at mount time if needed. I don't know that we have a method to force this recalculation... I guess mounting with quotas disabled, unmounting, then mounting again w/ quotas on will do it. Thanks, -Eric > Honza From sgi-linux-xfs@lo.gmane.org Thu Jun 10 12:47:40 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_27 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5AHlcT1087347 for ; Thu, 10 Jun 2010 12:47:40 -0500 X-ASG-Debug-ID: 1276192206-3319028a0000-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 08CC33BB7E9 for ; Thu, 10 Jun 2010 10:50:07 -0700 (PDT) Received: from lo.gmane.org (lo.gmane.org [80.91.229.12]) by cuda.sgi.com with ESMTP id 1AkXajDkGTLdPbXK for ; Thu, 10 Jun 2010 10:50:07 -0700 (PDT) Received: from list by lo.gmane.org with local (Exim 4.69) (envelope-from ) id 1OMltE-0007Ol-P0 for linux-xfs@oss.sgi.com; Thu, 10 Jun 2010 19:50:04 +0200 Received: from barriere.frankfurter-softwarefabrik.de ([217.11.197.1]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Thu, 10 Jun 2010 19:50:04 +0200 Received: from niemayer by barriere.frankfurter-softwarefabrik.de with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Thu, 10 Jun 2010 19:50:04 +0200 X-Injected-Via-Gmane: http://gmane.org/ To: linux-xfs@oss.sgi.com connect(): No such file or directory From: Peter Niemayer X-ASG-Orig-Subj: linux-2.6.34 xfs crash: xfs_inode_ag_iterator+0x6c - NULL pointer dereference Subject: linux-2.6.34 xfs crash: xfs_inode_ag_iterator+0x6c - NULL pointer dereference Date: Thu, 10 Jun 2010 19:45:01 +0200 Lines: 4688 Message-ID: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------000102000906050609040100" X-Complaints-To: usenet@dough.gmane.org X-Gmane-NNTP-Posting-Host: barriere.frankfurter-softwarefabrik.de User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.8) Gecko/20100227 Thunderbird/3.0.3 X-Barracuda-Connect: lo.gmane.org[80.91.229.12] X-Barracuda-Start-Time: 1276192209 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32163 Rule breakdown below pts rule 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 a multi-part message in MIME format. --------------000102000906050609040100 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Hi, FYI: attached screen-shot is from a server that crashed today when doing an "umount" of a no longer needed XFS partition on a SSD (mount options: rw,noatime,nodiratime,nobarrier) (The operations on that filesystem ended > 1 day before the umount, and did not show any problem) Kernel was plain vanilla 2.6.34. Regards, Peter Niemayer --------------000102000906050609040100 Content-Type: image/jpeg; name="gitega_xfs_crash.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="gitega_xfs_crash.jpg" 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 Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6AQAD AQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgsRAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYS QVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJ SlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKz tLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/AABEIBLAGQAMB IgACEQEDEQH/2gAMAwEAAhEDEQA/APuFR7U/6UcGlGa4uVHpx2Qgz3p/PrS4PY04Z71LRYgr K1xwkDFjwK1m4BrmvE0xSLBBOePrTURWuzP0m4L3ec/KB93FdjBL8o5rzyzvfs8mTWwPEYXq 2Ktw6ktO+x1c7fKcHmuE1mXFyxznmtqz14XjmNW+bGetZevWjZMqr19OtSo6k7PUyFuR0qRH JrPDHdVuGQfSuhQRPLqa+lHMpQ53HpVq/Tyhk1J4fs2mYyEfKBwSKua1aHycj8zUOKuFjGOo ER7SfaqXn/Pmn/Z9zBR39KfLZGFckYo9mA9tRPlBM8YxUujQvdT+YQdg45rOjiM0oTuTiuz0 nT/It1x6f0qORIHsZGujyrc7Rk4OK5Ahmckcmux8TtsBTH1rn9GiW4vCG5QdcURS6k2srme7 SAYyam0y0F3cAv0Ug1v6po4+z7o1O7ucflWBYTtbXAJJCngjFXZLYWrWh0lzILG247DgVzV1 fSXcuIzuB9KvareGWLhsVV0ZEeXJPINRyLdjVkrlWazmVdzmq1i7C6B9O9dNrTQrbkrgfSuY tD5kjEdqvli9kK7aNS/1Ro4vlPNc68lxcEhSTzmrl6x3hTWvYWka2y8DOOTS9mlqS5JI4u8j kJw/PrToCYYeOK1taVROABn1PpVGWPEJ+lUkiXqN029Y3Z3H5R1NaeoeIfs8QVTnPFYVvGUL EdTUFxE9xcKucEkCl7NFaBPrN5OcojH3Haqja3dRNg5znB4ru9P0KBLTlRuI4IrkNZs1W9wo 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 --------------000102000906050609040100-- From sandeen@sandeen.net Thu Jun 10 15:44:59 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5AKixaX094860 for ; Thu, 10 Jun 2010 15:44:59 -0500 X-ASG-Debug-ID: 1276202625-566201c20000-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 F000F3BC627 for ; Thu, 10 Jun 2010 13:43:45 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id SRn3NvjpVHmba57b for ; Thu, 10 Jun 2010 13:43:45 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id DB2024968903; Thu, 10 Jun 2010 15:43:44 -0500 (CDT) Message-ID: <4C114E80.4050803@sandeen.net> Date: Thu, 10 Jun 2010 15:43:44 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: Jan Kara CC: hch@infradead.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 4/8] Add test of quota accounting using fsx Subject: Re: [PATCH 4/8] Add test of quota accounting using fsx References: <1274710459-11446-1-git-send-email-jack@suse.cz> <1274710459-11446-5-git-send-email-jack@suse.cz> <4C0FD43D.3040803@sandeen.net> <20100610105813.GB10827@quack.suse.cz> <4C1117F3.2010008@sandeen.net> In-Reply-To: <4C1117F3.2010008@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: 1276202625 X-Barracuda-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.32173 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: > Jan Kara wrote: >> On Wed 09-06-10 12:49:49, Eric Sandeen wrote: >>> Jan Kara wrote: >>>> Run fsx (and also several fsx threads in parallel) and verify that >>>> quota accounting is correct after they finish. >>> Jan, I'm having trouble with this one on XFS for some reason, with our >>> RHEL6 kernel and quota-3.17... These don't seem to be working properly at all with xfs. In quota-3.17, quotaoff seems to turn off both accounting and enforcement, despite what the man page says - To turn off quota limit enforcement on any XFS filesystem, first make sure that quota accounting and enforcement are both turned on using repquota -v filesystem. Then, use quotaoff -v filesystem to disable limit enforce- ment. This may be done while the filesystem is mounted. And once accounting is turned off, it can't be re-enabled without a remount. With quota-4.0.0-preX, it seems to turn off -neither- accounting nor enforcement, based on hch's test: [14:59] qemu1:~/xfstests-dev# mount -o quota /dev/vdb5 /mnt/test [14:59] qemu1:~/xfstests-dev# quotaon -f /dev/vdb5 [15:00] qemu1:~/xfstests-dev# quotaon /dev/vdb5 [15:00] quotaon: Enable XFS group quota accounting during mount [15:00] quotaon: Enforcing user quota already on /dev/vdb5 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Argh ;) -Eric From tao.ma@oracle.com Fri Jun 11 01:00:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66, LOCAL_GNU_PATCH,UNPARSEABLE_RELAY autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5B60tji120869 for ; Fri, 11 Jun 2010 01:00:55 -0500 X-ASG-Debug-ID: 1276236208-1ebe01e10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from rcsinet10.oracle.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5AD383BD9DF; Thu, 10 Jun 2010 23:03:28 -0700 (PDT) Received: from rcsinet10.oracle.com (rcsinet10.oracle.com [148.87.113.121]) by cuda.sgi.com with ESMTP id 94yJKNFBMyFM1DxX; Thu, 10 Jun 2010 23:03:28 -0700 (PDT) Received: from acsinet15.oracle.com (acsinet15.oracle.com [141.146.126.227]) by rcsinet10.oracle.com (Switch-3.4.2/Switch-3.4.1) with ESMTP id o5B637hh005387 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 11 Jun 2010 06:03:09 GMT Received: from acsmt354.oracle.com (acsmt354.oracle.com [141.146.40.154]) by acsinet15.oracle.com (Switch-3.4.2/Switch-3.4.1) with ESMTP id o5B3n0hx015853; Fri, 11 Jun 2010 06:03:04 GMT Received: from abhmt010.oracle.com by acsmt355.oracle.com with ESMTP id 316311661276236157; Thu, 10 Jun 2010 23:02:37 -0700 Received: from localhost.localdomain (/10.182.120.191) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 10 Jun 2010 23:02:36 -0700 From: Tao Ma To: xfs@oss.sgi.com Cc: linux-kernel@vger.kernel.org, Tao Ma , Alex Elder , Christoph Hellwig , Dave Chinner X-ASG-Orig-Subj: [PATCH] xfs: Make fiemap works with sparse file. Subject: [PATCH] xfs: Make fiemap works with sparse file. Date: Fri, 11 Jun 2010 14:02:15 +0800 Message-Id: <1276236135-12051-1-git-send-email-tao.ma@oracle.com> X-Mailer: git-send-email 1.7.0.4 X-Auth-Type: Internal IP X-Source-IP: acsinet15.oracle.com [141.146.126.227] X-CT-RefId: str=0001.0A090204.4C11D19E.009E:SCFMA922111,ss=1,fgs=0 X-Barracuda-Connect: rcsinet10.oracle.com[148.87.113.121] X-Barracuda-Start-Time: 1276236209 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32210 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean In xfs_vn_fiemap, we set bvm_count to fi_extent_max + 1 and want to return fi_extent_max extents, but actually it won't work for a sparse file. The reason is that in xfs_getbmap we will calculate holes and set it in 'out', while out is malloced by bmv_count(fi_extent_max+1) which didn't consider holes. So in the worst case, if 'out' vector looks like [hole, extent, hole, extent, hole, ... hole, extent, hole], we will only return half of fi_extent_max extents. So in xfs_vn_fiemap, we should consider this worst case. If the user wants fi_extent_max extents, we need a 'out' with size of 2 *fi_extent_max + 1. Cc: Alex Elder Cc: Christoph Hellwig Cc: Dave Chinner Signed-off-by: Tao Ma --- fs/xfs/linux-2.6/xfs_iops.c | 16 ++++++++++++++-- 1 files changed, 14 insertions(+), 2 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c index 9c8019c..1db92e3 100644 --- a/fs/xfs/linux-2.6/xfs_iops.c +++ b/fs/xfs/linux-2.6/xfs_iops.c @@ -672,9 +672,21 @@ xfs_vn_fiemap( else bm.bmv_length = BTOBB(length); - /* We add one because in getbmap world count includes the header */ + /* + * It is a bit tricky for us to calculate the bmv_count from + * fi_extent_max. + * If we support to return fi_extent_max extents to the user, + * we need at most 2 * fi_extent_max + 1 for bmv_count since + * in xfs_getbmap we will calculate holes while fi_extent_max + * don't have them. So in the worst case, bmv can looks like + * [hole, extent, hole, extent, hole, ... hole, extent, hole]. + * So there will be 2 *fi_extent_max + 1. + * What's more, in getbmap world count have to include the + * header, so we need another bmv. So the total number will + * be 2 * fieinfo->fi_extents_max + 2. + */ bm.bmv_count = !fieinfo->fi_extents_max ? MAXEXTNUM : - fieinfo->fi_extents_max + 1; + 2 * fieinfo->fi_extents_max + 2; bm.bmv_count = min_t(__s32, bm.bmv_count, (PAGE_SIZE * 16 / sizeof(struct getbmapx))); bm.bmv_iflags = BMV_IF_PREALLOC; -- 1.5.5 From sandeen@sandeen.net Fri Jun 11 10:51:17 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5BFpH6o144740 for ; Fri, 11 Jun 2010 10:51:17 -0500 X-ASG-Debug-ID: 1276271630-1f4d034b0000-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 3F9283BF314 for ; Fri, 11 Jun 2010 08:53:51 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id 9HBYgAbMIC7fL0Jt for ; Fri, 11 Jun 2010 08:53:51 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 346EA42B9C5D; Fri, 11 Jun 2010 10:53:50 -0500 (CDT) Message-ID: <4C125C0D.4080600@sandeen.net> Date: Fri, 11 Jun 2010 10:53:49 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: Tao Ma CC: xfs@oss.sgi.com, Christoph Hellwig , linux-kernel@vger.kernel.org, Alex Elder X-ASG-Orig-Subj: Re: [PATCH] xfs: Make fiemap works with sparse file. Subject: Re: [PATCH] xfs: Make fiemap works with sparse file. References: <1276236135-12051-1-git-send-email-tao.ma@oracle.com> In-Reply-To: <1276236135-12051-1-git-send-email-tao.ma@oracle.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: 1276271631 X-Barracuda-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.32250 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 Tao Ma wrote: > In xfs_vn_fiemap, we set bvm_count to fi_extent_max + 1 and want > to return fi_extent_max extents, but actually it won't work for > a sparse file. The reason is that in xfs_getbmap we will > calculate holes and set it in 'out', while out is malloced by > bmv_count(fi_extent_max+1) which didn't consider holes. So in the > worst case, if 'out' vector looks like > [hole, extent, hole, extent, hole, ... hole, extent, hole], > we will only return half of fi_extent_max extents. > > So in xfs_vn_fiemap, we should consider this worst case. If the > user wants fi_extent_max extents, we need a 'out' with size of > 2 *fi_extent_max + 1. This all seems right to me, though your commit message above (+1) doesn't match the comment and code in the patch (+2) -Eric > Cc: Alex Elder > Cc: Christoph Hellwig > Cc: Dave Chinner > Signed-off-by: Tao Ma > --- > fs/xfs/linux-2.6/xfs_iops.c | 16 ++++++++++++++-- > 1 files changed, 14 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c > index 9c8019c..1db92e3 100644 > --- a/fs/xfs/linux-2.6/xfs_iops.c > +++ b/fs/xfs/linux-2.6/xfs_iops.c > @@ -672,9 +672,21 @@ xfs_vn_fiemap( > else > bm.bmv_length = BTOBB(length); > > - /* We add one because in getbmap world count includes the header */ > + /* > + * It is a bit tricky for us to calculate the bmv_count from > + * fi_extent_max. > + * If we support to return fi_extent_max extents to the user, > + * we need at most 2 * fi_extent_max + 1 for bmv_count since > + * in xfs_getbmap we will calculate holes while fi_extent_max > + * don't have them. So in the worst case, bmv can looks like > + * [hole, extent, hole, extent, hole, ... hole, extent, hole]. > + * So there will be 2 *fi_extent_max + 1. > + * What's more, in getbmap world count have to include the > + * header, so we need another bmv. So the total number will > + * be 2 * fieinfo->fi_extents_max + 2. > + */ > bm.bmv_count = !fieinfo->fi_extents_max ? MAXEXTNUM : > - fieinfo->fi_extents_max + 1; > + 2 * fieinfo->fi_extents_max + 2; > bm.bmv_count = min_t(__s32, bm.bmv_count, > (PAGE_SIZE * 16 / sizeof(struct getbmapx))); > bm.bmv_iflags = BMV_IF_PREALLOC; From BATV+476d4bb3db500d7e78e8+2483+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 11 11:12:39 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5BGCaFC145649 for ; Fri, 11 Jun 2010 11:12:39 -0500 X-ASG-Debug-ID: 1276272910-1f55038a0000-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 AC8FA3BF87F for ; Fri, 11 Jun 2010 09:15:10 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id p98sp1QdvpqEUOZZ for ; Fri, 11 Jun 2010 09:15:10 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1ON6st-00062q-Lw for xfs@oss.sgi.com; Fri, 11 Jun 2010 16:15:10 +0000 Message-Id: <20100611161312.446670249@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Fri, 11 Jun 2010 12:13:12 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 0/3] simplify the writeback code Subject: [PATCH 0/3] simplify the writeback code 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: 1276272910 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 writeback path has a lot of code that's been dead for a while. We're never asked to release dirty and thus delayed allocated or unwritten pages from ->releasepage, and since the introduction of ->page_mkwrite we also don't have to deal with dirty but unmapped buffers in ->writepage. But there's a case masquerading as such, which needs to be fixed by a 1.5 years old patch from Eric first. That patch also happens to fix xfstests 194. From BATV+476d4bb3db500d7e78e8+2483+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 11 11:12:39 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5BGCbMf145657 for ; Fri, 11 Jun 2010 11:12:39 -0500 X-ASG-Debug-ID: 1276272911-1f4e03970000-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 19AFB3BF87F for ; Fri, 11 Jun 2010 09:15:11 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 6jg2TdQUTXN7RpNZ for ; Fri, 11 Jun 2010 09:15:11 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1ON6sw-00064W-ES; Fri, 11 Jun 2010 16:15:11 +0000 Message-Id: <20100611161510.303551652@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Fri, 11 Jun 2010 12:13:13 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: Eric Sandeen X-ASG-Orig-Subj: [PATCH 1/3] xfs: fix corruption case for block size < page size Subject: [PATCH 1/3] xfs: fix corruption case for block size < page size References: <20100611161312.446670249@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-fix-194 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: 1276272912 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 From: Eric Sandeen xfstests 194 first truncats a file back and then extends it again by truncating it to a larger size. This causes discard_buffer to drop the mapped, but not the uptodate bit and thus creates something that xfs_page_state_convert takes for unmapped space created by mmap because it doesn't check for the dirty bit, which also gets cleared by discard_buffer and checked by other ->writepage implementations like block_write_full_page. Handle this kind of buffers early, and unlike Eric's first version of the patch simply ASSERT that the buffers is dirty, given that the mmap write case can't happen anymore since the introduction of ->page_mkwrite. The now dead code dealing with that will be deleted in a follow on patch. Signed-off-by: Eric Sandeen 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-06-10 08:59:49.598004335 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-06-11 09:20:31.292254712 +0200 @@ -1125,6 +1125,16 @@ xfs_page_state_convert( continue; } + /* + * A hole may still be marked uptodate because discard_buffer + * leaves the flag set. + */ + if (!buffer_mapped(bh) && buffer_uptodate(bh)) { + ASSERT(!buffer_dirty(bh)); + imap_valid = 0; + continue; + } + if (imap_valid) imap_valid = xfs_imap_valid(inode, &imap, offset); From BATV+476d4bb3db500d7e78e8+2483+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 11 11:12:41 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5BGCfHc145683 for ; Fri, 11 Jun 2010 11:12:41 -0500 X-ASG-Debug-ID: 1276273106-65a301bf0000-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 82389159483D for ; Fri, 11 Jun 2010 09:18:26 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id bm6PSBENprNvY5HM for ; Fri, 11 Jun 2010 09:18:26 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1ON6sx-00065X-UV for xfs@oss.sgi.com; Fri, 11 Jun 2010 16:15:12 +0000 Message-Id: <20100611161511.791495868@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Fri, 11 Jun 2010 12:13:14 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 2/3] xfs: simplify xfs_vm_releasepage Subject: [PATCH 2/3] xfs: simplify xfs_vm_releasepage References: <20100611161312.446670249@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-simplify-releasepage 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: 1276273107 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 xfs releasepage implementation has code to deal with converting delayed allocated and unwritten space. But we never get called for those as we always convert delayed and unwritten space when cleaning a page, or drop the state from the buffers in block_invalidatepage. We still keep a WARN_ON on those cases for now, but remove all the case dealing with it, which allows to fold xfs_page_state_convert into xfs_vm_writepage and remove the !startio case from the whole writeback path. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-06-11 09:22:13.864253873 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-06-11 09:27:27.602003840 +0200 @@ -754,7 +754,6 @@ xfs_convert_page( struct xfs_bmbt_irec *imap, xfs_ioend_t **ioendp, struct writeback_control *wbc, - int startio, int all_bh) { struct buffer_head *bh, *head; @@ -825,19 +824,14 @@ xfs_convert_page( ASSERT(imap->br_startblock != DELAYSTARTBLOCK); xfs_map_at_offset(inode, bh, imap, offset); - if (startio) { - xfs_add_to_ioend(inode, bh, offset, - type, ioendp, done); - } else { - set_buffer_dirty(bh); - unlock_buffer(bh); - mark_buffer_dirty(bh); - } + xfs_add_to_ioend(inode, bh, offset, type, + ioendp, done); + page_dirty--; count++; } else { type = IO_NEW; - if (buffer_mapped(bh) && all_bh && startio) { + if (buffer_mapped(bh) && all_bh) { lock_buffer(bh); xfs_add_to_ioend(inode, bh, offset, type, ioendp, done); @@ -852,14 +846,12 @@ xfs_convert_page( if (uptodate && bh == head) SetPageUptodate(page); - if (startio) { - if (count) { - wbc->nr_to_write--; - if (wbc->nr_to_write <= 0) - done = 1; - } - xfs_start_page_writeback(page, !page_dirty, count); + if (count) { + wbc->nr_to_write--; + if (wbc->nr_to_write <= 0) + done = 1; } + xfs_start_page_writeback(page, !page_dirty, count); return done; fail_unlock_page: @@ -879,7 +871,6 @@ xfs_cluster_write( struct xfs_bmbt_irec *imap, xfs_ioend_t **ioendp, struct writeback_control *wbc, - int startio, int all_bh, pgoff_t tlast) { @@ -895,7 +886,7 @@ xfs_cluster_write( for (i = 0; i < pagevec_count(&pvec); i++) { done = xfs_convert_page(inode, pvec.pages[i], tindex++, - imap, ioendp, wbc, startio, all_bh); + imap, ioendp, wbc, all_bh); if (done) break; } @@ -1025,51 +1016,101 @@ out_invalidate: } /* - * Calling this without startio set means we are being asked to make a dirty - * page ready for freeing it's buffers. When called with startio set then - * we are coming from writepage. + * Write out a dirty page. * - * When called with startio set it is important that we write the WHOLE - * page if possible. - * The bh->b_state's cannot know if any of the blocks or which block for - * that matter are dirty due to mmap writes, and therefore bh uptodate is - * only valid if the page itself isn't completely uptodate. Some layers - * may clear the page dirty flag prior to calling write page, under the - * assumption the entire page will be written out; by not writing out the - * whole page the page can be reused before all valid dirty data is - * written out. Note: in the case of a page that has been dirty'd by - * mapwrite and but partially setup by block_prepare_write the - * bh->b_states's will not agree and only ones setup by BPW/BCW will have - * valid state, thus the whole page must be written out thing. + * For delalloc space on the page we need to allocate space and flush it. + * For unwritten space on the page we need to start the conversion to + * regular allocated space. + * For unmapped buffer heads on the page we should allocate space if the + * page is uptodate. + * For any other dirty buffer heads on the page we should flush them. + * + * If we detect that a transaction would be required to flush the page, we + * have to check the process flags first, if we are already in a transaction + * or disk I/O during allocations is off, we need to fail the writepage and + * redirty the page. + * + * The bh->b_state's cannot know if any of the blocks or which block for that + * matter are dirty due to mmap writes, and therefore bh uptodate is only + * valid if the page itself isn't completely uptodate. */ - STATIC int -xfs_page_state_convert( - struct inode *inode, - struct page *page, - struct writeback_control *wbc, - int startio, - int unmapped) /* also implies page uptodate */ +xfs_vm_writepage( + struct page *page, + struct writeback_control *wbc) { + struct inode *inode = page->mapping->host; + int need_trans; + int delalloc, unmapped, unwritten; struct buffer_head *bh, *head; struct xfs_bmbt_irec imap; xfs_ioend_t *ioend = NULL, *iohead = NULL; loff_t offset; - unsigned long p_offset = 0; unsigned int type; __uint64_t end_offset; pgoff_t end_index, last_index; ssize_t size, len; int flags, err, imap_valid = 0, uptodate = 1; - int page_dirty, count = 0; - int trylock = 0; - int all_bh = unmapped; - - if (startio) { - if (wbc->sync_mode == WB_SYNC_NONE && wbc->nonblocking) - trylock |= BMAPI_TRYLOCK; + int count = 0; + int all_bh; + + trace_xfs_writepage(inode, page, 0); + + /* + * Refuse to write the page out if we are called from reclaim context. + * + * This is primarily to avoid stack overflows when called from deep + * used stacks in random callers for direct reclaim, but disabling + * reclaim for kswap is a nice side-effect as kswapd causes rather + * suboptimal I/O patters, too. + * + * This should really be done by the core VM, but until that happens + * filesystems like XFS, btrfs and ext4 have to take care of this + * by themselves. + */ + if (current->flags & PF_MEMALLOC) + goto out_fail; + + /* + * We need a transaction if: + * 1. There are delalloc buffers on the page + * 2. The page is uptodate and we have unmapped buffers + * 3. The page is uptodate and we have no buffers + * 4. There are unwritten buffers on the page + */ + if (!page_has_buffers(page)) { + unmapped = 1; + need_trans = 1; + } else { + xfs_count_page_state(page, &delalloc, &unmapped, &unwritten); + if (!PageUptodate(page)) + unmapped = 0; + need_trans = delalloc + unmapped + unwritten; } + /* + * If we need a transaction and the process flags say + * we are already in a transaction, or no IO is allowed + * then mark the page dirty again and leave the page + * as is. + */ + if (current_test_flags(PF_FSTRANS) && need_trans) + goto out_fail; + + /* + * Delay hooking up buffer heads until we have + * made our go/no-go decision. + */ + if (!page_has_buffers(page)) + create_empty_buffers(page, 1 << inode->i_blkbits, 0); + + /* + * VM calculation for nr_to_write seems off. Bump it way + * up, this gets simple streaming writes zippy again. + * To be reviewed again after Jens' writeback changes. + */ + wbc->nr_to_write *= 4; + /* Is this page beyond the end of the file? */ offset = i_size_read(inode); end_index = offset >> PAGE_CACHE_SHIFT; @@ -1077,53 +1118,27 @@ xfs_page_state_convert( if (page->index >= end_index) { if ((page->index >= end_index + 1) || !(i_size_read(inode) & (PAGE_CACHE_SIZE - 1))) { - if (startio) - unlock_page(page); + unlock_page(page); return 0; } } - /* - * page_dirty is initially a count of buffers on the page before - * EOF and is decremented as we move each into a cleanable state. - * - * Derivation: - * - * End offset is the highest offset that this page should represent. - * If we are on the last page, (end_offset & (PAGE_CACHE_SIZE - 1)) - * will evaluate non-zero and be less than PAGE_CACHE_SIZE and - * hence give us the correct page_dirty count. On any other page, - * it will be zero and in that case we need page_dirty to be the - * count of buffers on the page. - */ end_offset = min_t(unsigned long long, (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT, offset); len = 1 << inode->i_blkbits; - p_offset = min_t(unsigned long, end_offset & (PAGE_CACHE_SIZE - 1), - PAGE_CACHE_SIZE); - p_offset = p_offset ? roundup(p_offset, len) : PAGE_CACHE_SIZE; - page_dirty = p_offset / len; bh = head = page_buffers(page); offset = page_offset(page); flags = BMAPI_READ; type = IO_NEW; - /* TODO: cleanup count and page_dirty */ + all_bh = unmapped; do { if (offset >= end_offset) break; if (!buffer_uptodate(bh)) uptodate = 0; - if (!(PageUptodate(page) || buffer_uptodate(bh)) && !startio) { - /* - * the iomap is actually still valid, but the ioend - * isn't. shouldn't happen too often. - */ - imap_valid = 0; - continue; - } /* * A hole may still be marked uptodate because discard_buffer @@ -1150,7 +1165,7 @@ xfs_page_state_convert( */ if (buffer_unwritten(bh) || buffer_delay(bh) || ((buffer_uptodate(bh) || PageUptodate(page)) && - !buffer_mapped(bh) && (unmapped || startio))) { + !buffer_mapped(bh))) { int new_ioend = 0; /* @@ -1164,7 +1179,11 @@ xfs_page_state_convert( flags = BMAPI_WRITE | BMAPI_IGNSTATE; } else if (buffer_delay(bh)) { type = IO_DELAY; - flags = BMAPI_ALLOCATE | trylock; + flags = BMAPI_ALLOCATE; + + if (wbc->sync_mode == WB_SYNC_NONE && + wbc->nonblocking) + flags |= BMAPI_TRYLOCK; } else { type = IO_NEW; flags = BMAPI_WRITE | BMAPI_MMAP; @@ -1196,19 +1215,11 @@ xfs_page_state_convert( } if (imap_valid) { xfs_map_at_offset(inode, bh, &imap, offset); - if (startio) { - xfs_add_to_ioend(inode, bh, offset, - type, &ioend, - new_ioend); - } else { - set_buffer_dirty(bh); - unlock_buffer(bh); - mark_buffer_dirty(bh); - } - page_dirty--; + xfs_add_to_ioend(inode, bh, offset, type, + &ioend, new_ioend); count++; } - } else if (buffer_uptodate(bh) && startio) { + } else if (buffer_uptodate(bh)) { /* * we got here because the buffer is already mapped. * That means it must already have extents allocated @@ -1241,13 +1252,11 @@ xfs_page_state_convert( all_bh = 1; xfs_add_to_ioend(inode, bh, offset, type, &ioend, !imap_valid); - page_dirty--; count++; } else { imap_valid = 0; } - } else if ((buffer_uptodate(bh) || PageUptodate(page)) && - (unmapped || startio)) { + } else if (PageUptodate(page)) { imap_valid = 0; } @@ -1259,8 +1268,7 @@ xfs_page_state_convert( if (uptodate && bh == head) SetPageUptodate(page); - if (startio) - xfs_start_page_writeback(page, 1, count); + xfs_start_page_writeback(page, 1, count); if (ioend && imap_valid) { xfs_off_t end_index; @@ -1278,139 +1286,28 @@ xfs_page_state_convert( end_index = last_index; xfs_cluster_write(inode, page->index + 1, &imap, &ioend, - wbc, startio, all_bh, end_index); + wbc, all_bh, end_index); } if (iohead) xfs_submit_ioend(wbc, iohead); - return page_dirty; + return 0; error: if (iohead) xfs_cancel_ioend(iohead); - /* - * If it's delalloc and we have nowhere to put it, - * throw it away, unless the lower layers told - * us to try again. - */ - if (err != -EAGAIN) { - if (!unmapped) - xfs_aops_discard_page(page); - ClearPageUptodate(page); - } + if (!unmapped) + xfs_aops_discard_page(page); + ClearPageUptodate(page); + unlock_page(page); return err; -} - -/* - * writepage: Called from one of two places: - * - * 1. we are flushing a delalloc buffer head. - * - * 2. we are writing out a dirty page. Typically the page dirty - * state is cleared before we get here. In this case is it - * conceivable we have no buffer heads. - * - * For delalloc space on the page we need to allocate space and - * flush it. For unmapped buffer heads on the page we should - * allocate space if the page is uptodate. For any other dirty - * buffer heads on the page we should flush them. - * - * If we detect that a transaction would be required to flush - * the page, we have to check the process flags first, if we - * are already in a transaction or disk I/O during allocations - * is off, we need to fail the writepage and redirty the page. - */ - -STATIC int -xfs_vm_writepage( - struct page *page, - struct writeback_control *wbc) -{ - int error; - int need_trans; - int delalloc, unmapped, unwritten; - struct inode *inode = page->mapping->host; - - trace_xfs_writepage(inode, page, 0); - - /* - * Refuse to write the page out if we are called from reclaim context. - * - * This is primarily to avoid stack overflows when called from deep - * used stacks in random callers for direct reclaim, but disabling - * reclaim for kswap is a nice side-effect as kswapd causes rather - * suboptimal I/O patters, too. - * - * This should really be done by the core VM, but until that happens - * filesystems like XFS, btrfs and ext4 have to take care of this - * by themselves. - */ - if (current->flags & PF_MEMALLOC) - goto out_fail; - - /* - * We need a transaction if: - * 1. There are delalloc buffers on the page - * 2. The page is uptodate and we have unmapped buffers - * 3. The page is uptodate and we have no buffers - * 4. There are unwritten buffers on the page - */ - - if (!page_has_buffers(page)) { - unmapped = 1; - need_trans = 1; - } else { - xfs_count_page_state(page, &delalloc, &unmapped, &unwritten); - if (!PageUptodate(page)) - unmapped = 0; - need_trans = delalloc + unmapped + unwritten; - } - - /* - * If we need a transaction and the process flags say - * we are already in a transaction, or no IO is allowed - * then mark the page dirty again and leave the page - * as is. - */ - if (current_test_flags(PF_FSTRANS) && need_trans) - goto out_fail; - - /* - * Delay hooking up buffer heads until we have - * made our go/no-go decision. - */ - if (!page_has_buffers(page)) - create_empty_buffers(page, 1 << inode->i_blkbits, 0); - - - /* - * VM calculation for nr_to_write seems off. Bump it way - * up, this gets simple streaming writes zippy again. - * To be reviewed again after Jens' writeback changes. - */ - wbc->nr_to_write *= 4; - - /* - * Convert delayed allocate, unwritten or unmapped space - * to real space and flush out to disk. - */ - error = xfs_page_state_convert(inode, page, wbc, 1, unmapped); - if (error == -EAGAIN) - goto out_fail; - if (unlikely(error < 0)) - goto out_unlock; - - return 0; out_fail: redirty_page_for_writepage(wbc, page); unlock_page(page); return 0; -out_unlock: - unlock_page(page); - return error; } STATIC int @@ -1424,65 +1321,27 @@ xfs_vm_writepages( /* * Called to move a page into cleanable state - and from there - * to be released. Possibly the page is already clean. We always + * to be released. The page should already be clean. We always * have buffer heads in this call. * - * Returns 0 if the page is ok to release, 1 otherwise. - * - * Possible scenarios are: - * - * 1. We are being called to release a page which has been written - * to via regular I/O. buffer heads will be dirty and possibly - * delalloc. If no delalloc buffer heads in this case then we - * can just return zero. - * - * 2. We are called to release a page which has been written via - * mmap, all we need to do is ensure there is no delalloc - * state in the buffer heads, if not we can let the caller - * free them and we should come back later via writepage. + * Returns 1 if the page is ok to release, 0 otherwise. */ STATIC int xfs_vm_releasepage( struct page *page, gfp_t gfp_mask) { - struct inode *inode = page->mapping->host; - int dirty, delalloc, unmapped, unwritten; - struct writeback_control wbc = { - .sync_mode = WB_SYNC_ALL, - .nr_to_write = 1, - }; - - trace_xfs_releasepage(inode, page, 0); + int delalloc, unmapped, unwritten; - if (!page_has_buffers(page)) - return 0; + trace_xfs_releasepage(page->mapping->host, page, 0); xfs_count_page_state(page, &delalloc, &unmapped, &unwritten); - if (!delalloc && !unwritten) - goto free_buffers; - if (!(gfp_mask & __GFP_FS)) + if (WARN_ON(delalloc)) return 0; - - /* If we are already inside a transaction or the thread cannot - * do I/O, we cannot release this page. - */ - if (current_test_flags(PF_FSTRANS)) + if (WARN_ON(unwritten)) return 0; - /* - * Convert delalloc space to real space, do not flush the - * data out to disk, that will be done by the caller. - * Never need to allocate space here - we will always - * come back to writepage in that case. - */ - dirty = xfs_page_state_convert(inode, page, &wbc, 0, 0); - if (dirty == 0 && !unwritten) - goto free_buffers; - return 0; - -free_buffers: return try_to_free_buffers(page); } From BATV+476d4bb3db500d7e78e8+2483+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 11 11:12:39 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5BGCdYl145659 for ; Fri, 11 Jun 2010 11:12:39 -0500 X-ASG-Debug-ID: 1276272912-39b001360000-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 DBCE314C083A for ; Fri, 11 Jun 2010 09:15:12 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id SqfVDEFMpRddWv1f for ; Fri, 11 Jun 2010 09:15:12 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1ON6sy-00066Z-GK for xfs@oss.sgi.com; Fri, 11 Jun 2010 16:15:12 +0000 Message-Id: <20100611161512.404472115@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Fri, 11 Jun 2010 12:13:15 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 3/3] xfs: simplify xfs_vm_writepage Subject: [PATCH 3/3] xfs: simplify xfs_vm_writepage References: <20100611161312.446670249@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-simplify-writepage 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: 1276272912 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 writepage implementation in XFS still tries to deal with dirty but unmapped buffers which used to caused by writes through shared mmaps. Since the introduction of ->page_mkwrite these can't happen anymore, so remove the code dealing with them. Note that the all_bh variable which causes us to start I/O on all buffers on the pages was controlled by the count of unmapped buffers, which also included those not actually dirty. It's now unconditionally initialized to 0 but set to 1 for the case of small file size extensions. It probably can be removed entirely, but that's left for another patch. 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-06-11 09:27:27.602003840 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-06-11 09:28:45.408003978 +0200 @@ -85,18 +85,15 @@ void xfs_count_page_state( struct page *page, int *delalloc, - int *unmapped, int *unwritten) { struct buffer_head *bh, *head; - *delalloc = *unmapped = *unwritten = 0; + *delalloc = *unwritten = 0; bh = head = page_buffers(page); do { - if (buffer_uptodate(bh) && !buffer_mapped(bh)) - (*unmapped) = 1; - else if (buffer_unwritten(bh)) + if (buffer_unwritten(bh)) (*unwritten) = 1; else if (buffer_delay(bh)) (*delalloc) = 1; @@ -607,31 +604,30 @@ xfs_map_at_offset( STATIC unsigned int xfs_probe_page( struct page *page, - unsigned int pg_offset, - int mapped) + unsigned int pg_offset) { + struct buffer_head *bh, *head; int ret = 0; if (PageWriteback(page)) return 0; + if (!PageDirty(page)) + return 0; + if (!page->mapping) + return 0; + if (!page_has_buffers(page)) + return 0; - if (page->mapping && PageDirty(page)) { - if (page_has_buffers(page)) { - struct buffer_head *bh, *head; - - bh = head = page_buffers(page); - do { - if (!buffer_uptodate(bh)) - break; - if (mapped != buffer_mapped(bh)) - break; - ret += bh->b_size; - if (ret >= pg_offset) - break; - } while ((bh = bh->b_this_page) != head); - } else - ret = mapped ? 0 : PAGE_CACHE_SIZE; - } + bh = head = page_buffers(page); + do { + if (!buffer_uptodate(bh)) + break; + if (!buffer_mapped(bh)) + break; + ret += bh->b_size; + if (ret >= pg_offset) + break; + } while ((bh = bh->b_this_page) != head); return ret; } @@ -641,8 +637,7 @@ xfs_probe_cluster( struct inode *inode, struct page *startpage, struct buffer_head *bh, - struct buffer_head *head, - int mapped) + struct buffer_head *head) { struct pagevec pvec; pgoff_t tindex, tlast, tloff; @@ -651,7 +646,7 @@ xfs_probe_cluster( /* First sum forwards in this page */ do { - if (!buffer_uptodate(bh) || (mapped != buffer_mapped(bh))) + if (!buffer_uptodate(bh) || !buffer_mapped(bh)) return total; total += bh->b_size; } while ((bh = bh->b_this_page) != head); @@ -685,7 +680,7 @@ xfs_probe_cluster( pg_offset = PAGE_CACHE_SIZE; if (page->index == tindex && trylock_page(page)) { - pg_len = xfs_probe_page(page, pg_offset, mapped); + pg_len = xfs_probe_page(page, pg_offset); unlock_page(page); } @@ -1021,18 +1016,12 @@ out_invalidate: * For delalloc space on the page we need to allocate space and flush it. * For unwritten space on the page we need to start the conversion to * regular allocated space. - * For unmapped buffer heads on the page we should allocate space if the - * page is uptodate. * For any other dirty buffer heads on the page we should flush them. * * If we detect that a transaction would be required to flush the page, we * have to check the process flags first, if we are already in a transaction * or disk I/O during allocations is off, we need to fail the writepage and * redirty the page. - * - * The bh->b_state's cannot know if any of the blocks or which block for that - * matter are dirty due to mmap writes, and therefore bh uptodate is only - * valid if the page itself isn't completely uptodate. */ STATIC int xfs_vm_writepage( @@ -1040,8 +1029,7 @@ xfs_vm_writepage( struct writeback_control *wbc) { struct inode *inode = page->mapping->host; - int need_trans; - int delalloc, unmapped, unwritten; + int delalloc, unwritten; struct buffer_head *bh, *head; struct xfs_bmbt_irec imap; xfs_ioend_t *ioend = NULL, *iohead = NULL; @@ -1052,10 +1040,12 @@ xfs_vm_writepage( ssize_t size, len; int flags, err, imap_valid = 0, uptodate = 1; int count = 0; - int all_bh; + int all_bh = 0; trace_xfs_writepage(inode, page, 0); + ASSERT(page_has_buffers(page)); + /* * Refuse to write the page out if we are called from reclaim context. * @@ -1072,39 +1062,18 @@ xfs_vm_writepage( goto out_fail; /* - * We need a transaction if: - * 1. There are delalloc buffers on the page - * 2. The page is uptodate and we have unmapped buffers - * 3. The page is uptodate and we have no buffers - * 4. There are unwritten buffers on the page - */ - if (!page_has_buffers(page)) { - unmapped = 1; - need_trans = 1; - } else { - xfs_count_page_state(page, &delalloc, &unmapped, &unwritten); - if (!PageUptodate(page)) - unmapped = 0; - need_trans = delalloc + unmapped + unwritten; - } - - /* - * If we need a transaction and the process flags say - * we are already in a transaction, or no IO is allowed - * then mark the page dirty again and leave the page - * as is. + * We need a transaction if there are delalloc or unwritten buffers + * on the page. + * + * If we need a transaction and the process flags say we are already + * in a transaction, or no IO is allowed then mark the page dirty + * again and leave the page as is. */ - if (current_test_flags(PF_FSTRANS) && need_trans) + xfs_count_page_state(page, &delalloc, &unwritten); + if ((current->flags & PF_FSTRANS) && (delalloc || unwritten)) goto out_fail; /* - * Delay hooking up buffer heads until we have - * made our go/no-go decision. - */ - if (!page_has_buffers(page)) - create_empty_buffers(page, 1 << inode->i_blkbits, 0); - - /* * VM calculation for nr_to_write seems off. Bump it way * up, this gets simple streaming writes zippy again. * To be reviewed again after Jens' writeback changes. @@ -1124,7 +1093,8 @@ xfs_vm_writepage( } end_offset = min_t(unsigned long long, - (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT, offset); + (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT, + offset); len = 1 << inode->i_blkbits; bh = head = page_buffers(page); @@ -1132,8 +1102,6 @@ xfs_vm_writepage( flags = BMAPI_READ; type = IO_NEW; - all_bh = unmapped; - do { if (offset >= end_offset) break; @@ -1153,19 +1121,7 @@ xfs_vm_writepage( if (imap_valid) imap_valid = xfs_imap_valid(inode, &imap, offset); - /* - * First case, map an unwritten extent and prepare for - * extent state conversion transaction on completion. - * - * Second case, allocate space for a delalloc buffer. - * We can return EAGAIN here in the release page case. - * - * Third case, an unmapped buffer was found, and we are - * in a path where we need to write the whole page out. - */ - if (buffer_unwritten(bh) || buffer_delay(bh) || - ((buffer_uptodate(bh) || PageUptodate(page)) && - !buffer_mapped(bh))) { + if (buffer_unwritten(bh) || buffer_delay(bh)) { int new_ioend = 0; /* @@ -1184,14 +1140,11 @@ xfs_vm_writepage( if (wbc->sync_mode == WB_SYNC_NONE && wbc->nonblocking) flags |= BMAPI_TRYLOCK; - } else { - type = IO_NEW; - flags = BMAPI_WRITE | BMAPI_MMAP; } if (!imap_valid) { /* - * if we didn't have a valid mapping then we + * If we didn't have a valid mapping then we * need to ensure that we put the new mapping * in a new ioend structure. This needs to be * done to ensure that the ioends correctly @@ -1199,14 +1152,7 @@ xfs_vm_writepage( * for unwritten extent conversion. */ new_ioend = 1; - if (type == IO_NEW) { - size = xfs_probe_cluster(inode, - page, bh, head, 0); - } else { - size = len; - } - - err = xfs_map_blocks(inode, offset, size, + err = xfs_map_blocks(inode, offset, len, &imap, flags); if (err) goto error; @@ -1227,8 +1173,7 @@ xfs_vm_writepage( */ if (!imap_valid || flags != BMAPI_READ) { flags = BMAPI_READ; - size = xfs_probe_cluster(inode, page, bh, - head, 1); + size = xfs_probe_cluster(inode, page, bh, head); err = xfs_map_blocks(inode, offset, size, &imap, flags); if (err) @@ -1247,7 +1192,6 @@ xfs_vm_writepage( */ type = IO_NEW; if (trylock_buffer(bh)) { - ASSERT(buffer_mapped(bh)); if (imap_valid) all_bh = 1; xfs_add_to_ioend(inode, bh, offset, type, @@ -1257,6 +1201,7 @@ xfs_vm_writepage( imap_valid = 0; } } else if (PageUptodate(page)) { + ASSERT(buffer_mapped(bh)); imap_valid = 0; } @@ -1298,8 +1243,7 @@ error: if (iohead) xfs_cancel_ioend(iohead); - if (!unmapped) - xfs_aops_discard_page(page); + xfs_aops_discard_page(page); ClearPageUptodate(page); unlock_page(page); return err; @@ -1331,11 +1275,11 @@ xfs_vm_releasepage( struct page *page, gfp_t gfp_mask) { - int delalloc, unmapped, unwritten; + int delalloc, unwritten; trace_xfs_releasepage(page->mapping->host, page, 0); - xfs_count_page_state(page, &delalloc, &unmapped, &unwritten); + xfs_count_page_state(page, &delalloc, &unwritten); if (WARN_ON(delalloc)) return 0; Index: xfs/fs/xfs/linux-2.6/xfs_aops.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.h 2010-02-13 22:45:45.000000000 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_aops.h 2010-06-11 09:27:44.075004398 +0200 @@ -45,6 +45,6 @@ extern int xfs_get_blocks(struct inode * extern void xfs_ioend_init(void); extern void xfs_ioend_wait(struct xfs_inode *); -extern void xfs_count_page_state(struct page *, int *, int *, int *); +extern void xfs_count_page_state(struct page *, int *, int *); #endif /* __XFS_AOPS_H__ */ Index: xfs/fs/xfs/linux-2.6/xfs_trace.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_trace.h 2010-06-04 15:12:52.000000000 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_trace.h 2010-06-11 09:27:44.083003979 +0200 @@ -829,33 +829,29 @@ DECLARE_EVENT_CLASS(xfs_page_class, __field(loff_t, size) __field(unsigned long, offset) __field(int, delalloc) - __field(int, unmapped) __field(int, unwritten) ), TP_fast_assign( - int delalloc = -1, unmapped = -1, unwritten = -1; + int delalloc = -1, unwritten = -1; if (page_has_buffers(page)) - xfs_count_page_state(page, &delalloc, - &unmapped, &unwritten); + xfs_count_page_state(page, &delalloc, &unwritten); __entry->dev = inode->i_sb->s_dev; __entry->ino = XFS_I(inode)->i_ino; __entry->pgoff = page_offset(page); __entry->size = i_size_read(inode); __entry->offset = off; __entry->delalloc = delalloc; - __entry->unmapped = unmapped; __entry->unwritten = unwritten; ), TP_printk("dev %d:%d ino 0x%llx pgoff 0x%lx size 0x%llx offset %lx " - "delalloc %d unmapped %d unwritten %d", + "delalloc %d unwritten %d", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->ino, __entry->pgoff, __entry->size, __entry->offset, __entry->delalloc, - __entry->unmapped, __entry->unwritten) ) From BATV+476d4bb3db500d7e78e8+2483+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 11 11:15:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5BGFoRq146060 for ; Fri, 11 Jun 2010 11:15:51 -0500 X-ASG-Debug-ID: 1276273104-39af01560000-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 19B3C14C08BE for ; Fri, 11 Jun 2010 09:18:24 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id uCrGlMcbGsolRgfi for ; Fri, 11 Jun 2010 09:18:24 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1ON6w4-0002AM-Qs for xfs@oss.sgi.com; Fri, 11 Jun 2010 16:18:24 +0000 Date: Fri, 11 Jun 2010 12:18:24 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: remove xfs_iput_new Subject: [PATCH] xfs: remove xfs_iput_new Message-ID: <20100611161824.GA7556@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.20 (2009-08-17) 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: 1276273105 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 never get an i_mode of 0 or a locked VFS inode until we pass in the XFS_IGET_CREATE flag to xfs_iget, which makes xfs_iput_new equivalent to xfs_iput for the only caller. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/linux-2.6/xfs_export.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_export.c 2010-06-09 15:24:59.480253950 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_export.c 2010-06-09 15:25:16.668003845 +0200 @@ -148,7 +148,7 @@ xfs_nfs_get_inode( } if (ip->i_d.di_gen != generation) { - xfs_iput_new(ip, XFS_ILOCK_SHARED); + xfs_iput(ip, XFS_ILOCK_SHARED); return ERR_PTR(-ENOENT); } Index: xfs/fs/xfs/xfs_iget.c =================================================================== --- xfs.orig/fs/xfs/xfs_iget.c 2010-06-09 15:24:59.492254229 +0200 +++ xfs/fs/xfs/xfs_iget.c 2010-06-09 15:25:11.454004125 +0200 @@ -439,29 +439,6 @@ xfs_iput(xfs_inode_t *ip, } /* - * Special iput for brand-new inodes that are still locked - */ -void -xfs_iput_new( - xfs_inode_t *ip, - uint lock_flags) -{ - struct inode *inode = VFS_I(ip); - - xfs_itrace_entry(ip); - - if ((ip->i_d.di_mode == 0)) { - ASSERT(!xfs_iflags_test(ip, XFS_IRECLAIMABLE)); - make_bad_inode(inode); - } - if (inode->i_state & I_NEW) - unlock_new_inode(inode); - if (lock_flags) - xfs_iunlock(ip, lock_flags); - IRELE(ip); -} - -/* * This is called free all the memory associated with an inode. * It must free the inode itself and any buffers allocated for * if_extents/if_data and if_broot. It must also free the lock Index: xfs/fs/xfs/xfs_inode.h =================================================================== --- xfs.orig/fs/xfs/xfs_inode.h 2010-06-09 15:24:59.506253740 +0200 +++ xfs/fs/xfs/xfs_inode.h 2010-06-09 15:25:14.794005243 +0200 @@ -444,7 +444,6 @@ static inline void xfs_ifunlock(xfs_inod int xfs_iget(struct xfs_mount *, struct xfs_trans *, xfs_ino_t, uint, uint, xfs_inode_t **, xfs_daddr_t); void xfs_iput(xfs_inode_t *, uint); -void xfs_iput_new(xfs_inode_t *, uint); void xfs_ilock(xfs_inode_t *, uint); int xfs_ilock_nowait(xfs_inode_t *, uint); void xfs_iunlock(xfs_inode_t *, uint); From BATV+476d4bb3db500d7e78e8+2483+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 11 11:16:49 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_27 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5BGGn5V146108 for ; Fri, 11 Jun 2010 11:16:49 -0500 X-ASG-Debug-ID: 1276273163-1bf603d70000-w1Z2WR 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 1013A3BF8D9 for ; Fri, 11 Jun 2010 09:19:23 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id qWpUZ0SLDbxhjjY9 for ; Fri, 11 Jun 2010 09:19:23 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1ON6x0-0003nU-QK; Fri, 11 Jun 2010 16:19:22 +0000 Date: Fri, 11 Jun 2010 12:19:22 -0400 From: Christoph Hellwig To: Peter Niemayer Cc: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: Re: linux-2.6.34 xfs crash: xfs_inode_ag_iterator+0x6c - NULL pointer dereference Subject: Re: linux-2.6.34 xfs crash: xfs_inode_ag_iterator+0x6c - NULL pointer dereference Message-ID: <20100611161922.GB7556@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.20 (2009-08-17) 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: 1276273164 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, Jun 10, 2010 at 07:45:01PM +0200, Peter Niemayer wrote: > Hi, > > FYI: attached screen-shot is from a server that crashed today when > doing an "umount" of a no longer needed XFS partition on a SSD > (mount options: rw,noatime,nodiratime,nobarrier) > > (The operations on that filesystem ended > 1 day before the umount, > and did not show any problem) > > Kernel was plain vanilla 2.6.34. Unfortunately the backtrace doesn't really tell what has happened as the origin of the backtrace scrolled away. From BATV+476d4bb3db500d7e78e8+2483+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 11 11:17:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5BGHZSE146157 for ; Fri, 11 Jun 2010 11:17:35 -0500 X-ASG-Debug-ID: 1276273209-1f5203c30000-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 D62743BF514 for ; Fri, 11 Jun 2010 09:20:09 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id iQjVoCZjeT5FY2QW for ; Fri, 11 Jun 2010 09:20:09 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1ON6xj-0005xR-TS; Fri, 11 Jun 2010 16:20:07 +0000 Date: Fri, 11 Jun 2010 12:20:07 -0400 From: Christoph Hellwig To: Andi Kleen Cc: xfs@oss.sgi.com, akpm@linux-foundation.org, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: Re: [PATCH] [16/23] XFS: Fix gcc 4.6 set but not read and unused statement warnings Subject: Re: [PATCH] [16/23] XFS: Fix gcc 4.6 set but not read and unused statement warnings Message-ID: <20100611162007.GC7556@infradead.org> References: <20100610110.764742110@firstfloor.org> <20100610111052.3DDC5B1A2B@basil.firstfloor.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100610111052.3DDC5B1A2B@basil.firstfloor.org> User-Agent: Mutt/1.5.20 (2009-08-17) 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: 1276273209 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 this looks good to me, but I really don't like the QASSERT macro. If you're fine with it I'll split this up into smaller patches and resubmit the unmodified parts under your name and redo those bits I don't like. From andi@firstfloor.org Fri Jun 11 11:34:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5BGYF3c146892 for ; Fri, 11 Jun 2010 11:34:15 -0500 X-ASG-Debug-ID: 1276274400-689e026a0000-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 1DCEF15949EB for ; Fri, 11 Jun 2010 09:40:00 -0700 (PDT) Received: from one.firstfloor.org (one.firstfloor.org [213.235.205.2]) by cuda.sgi.com with ESMTP id 9ARQtnn5bG5zMFbo for ; Fri, 11 Jun 2010 09:40:00 -0700 (PDT) Received: from basil.firstfloor.org (p5B3CB61A.dip0.t-ipconnect.de [91.60.182.26]) by one.firstfloor.org (Postfix) with ESMTP id 0FE6D1EE801C; Fri, 11 Jun 2010 18:36:45 +0200 (CEST) Received: by basil.firstfloor.org (Postfix, from userid 1000) id 5D419B1A33; Fri, 11 Jun 2010 18:36:44 +0200 (CEST) Date: Fri, 11 Jun 2010 18:36:44 +0200 From: Andi Kleen To: Christoph Hellwig Cc: Andi Kleen , xfs@oss.sgi.com, akpm@linux-foundation.org, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: Re: [PATCH] [16/23] XFS: Fix gcc 4.6 set but not read and unused statement warnings Subject: Re: [PATCH] [16/23] XFS: Fix gcc 4.6 set but not read and unused statement warnings Message-ID: <20100611163644.GH6864@basil.fritz.box> References: <20100610110.764742110@firstfloor.org> <20100610111052.3DDC5B1A2B@basil.firstfloor.org> <20100611162007.GC7556@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100611162007.GC7556@infradead.org> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: one.firstfloor.org[213.235.205.2] X-Barracuda-Start-Time: 1276274401 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0206 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32253 Rule breakdown below pts rule 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, Jun 11, 2010 at 12:20:07PM -0400, Christoph Hellwig wrote: > Most of this looks good to me, but I really don't like the QASSERT > macro. If you're fine with it I'll split this up into smaller patches Why do you not like it? The alternative will be likely uglier. > and resubmit the unmodified parts under your name and redo those bits > I don't like. Fine for me. -Andi -- ak@linux.intel.com -- Speaking for myself only. From sgi-linux-xfs@lo.gmane.org Fri Jun 11 11:46:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5BGkqLf147620 for ; Fri, 11 Jun 2010 11:46:52 -0500 X-ASG-Debug-ID: 1276274965-621100470000-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 2D6CF3BFB11 for ; Fri, 11 Jun 2010 09:49:25 -0700 (PDT) Received: from lo.gmane.org (lo.gmane.org [80.91.229.12]) by cuda.sgi.com with ESMTP id Qs6MZCmt1IYwHW1y for ; Fri, 11 Jun 2010 09:49:25 -0700 (PDT) Received: from list by lo.gmane.org with local (Exim 4.69) (envelope-from ) id 1ON7Q2-0001Fg-Lo for linux-xfs@oss.sgi.com; Fri, 11 Jun 2010 18:49:22 +0200 Received: from barriere.frankfurter-softwarefabrik.de ([217.11.197.1]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 11 Jun 2010 18:49:22 +0200 Received: from niemayer by barriere.frankfurter-softwarefabrik.de with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 11 Jun 2010 18:49:22 +0200 X-Injected-Via-Gmane: http://gmane.org/ To: linux-xfs@oss.sgi.com connect(): No such file or directory From: Peter Niemayer X-ASG-Orig-Subj: Re: linux-2.6.34 xfs crash: xfs_inode_ag_iterator+0x6c - NULL pointer dereference Subject: Re: linux-2.6.34 xfs crash: xfs_inode_ag_iterator+0x6c - NULL pointer dereference Date: Fri, 11 Jun 2010 18:49:10 +0200 Lines: 11 Message-ID: References: <20100611161922.GB7556@infradead.org> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Complaints-To: usenet@dough.gmane.org X-Gmane-NNTP-Posting-Host: barriere.frankfurter-softwarefabrik.de User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.8) Gecko/20100227 Thunderbird/3.0.3 In-Reply-To: <20100611161922.GB7556@infradead.org> X-Barracuda-Connect: lo.gmane.org[80.91.229.12] X-Barracuda-Start-Time: 1276274966 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32252 Rule breakdown below pts rule 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 06/11/2010 06:19 PM, Christoph Hellwig wrote: > Unfortunately the backtrace doesn't really tell what has happened as > the origin of the backtrace scrolled away. Oh, sorry. Now it's too late for this incident - but if it happens again, I'll try to do screen-shots also from the "upper" part of the scroll buffer. Regards, Peter Niemayer From sandeen@redhat.com Fri Jun 11 17:06:47 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5BM6lnr164829 for ; Fri, 11 Jun 2010 17:06:47 -0500 X-ASG-Debug-ID: 1276294354-1b1903990000-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 8238012A8B21 for ; Fri, 11 Jun 2010 15:12:34 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id yoNmTWtiL8UaLvaJ for ; Fri, 11 Jun 2010 15:12:34 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from int-mx08.intmail.prod.int.phx2.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o5BM9K1T009219 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 11 Jun 2010 18:09:20 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx08.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o5BM9EG9009232 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 11 Jun 2010 18:09:18 -0400 Message-ID: <4C12B40A.2070405@redhat.com> Date: Fri, 11 Jun 2010 17:09:14 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: Jan Kara CC: xfs-oss X-ASG-Orig-Subj: [PATCH] quota: don't disable accounting with quotaoff Subject: [PATCH] quota: don't disable accounting with quotaoff 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: 1276294355 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 quotaon(8) man page says: NOTES ON XFS FILESYSTEMS ... To turn off quota limit enforcement on any XFS filesys- tem, first make sure that quota accounting and enforce- ment are both turned on using repquota -v filesystem. Then, use quotaoff -v filesystem to disable limit enforcement. This may be done while the filesystem is mounted. Turning on quota limit enforcement on an XFS filesystem is achieved using quotaon -v filesystem. This may be done while the filesystem is mounted however, quotaoff turns off both enforcement -and- accounting, and then quotaon fails. If the manpage describes the intended behavior, then I think the following patch is needed. Signed-off-by: Eric Sandeen --- --- quota-tools/quotaon_xfs.c 2010-01-05 10:39:54.000000000 -0500 +++ quota-tools-mine/quotaon_xfs.c 2010-06-11 17:45:12.000000000 -0400 @@ -208,10 +208,9 @@ } #endif /* XFS_ROOTHACK */ - if (xarg == NULL) { /* both acct & enfd on/off */ - xopts |= (type == USRQUOTA) ? - (XFS_QUOTA_UDQ_ACCT | XFS_QUOTA_UDQ_ENFD) : - (XFS_QUOTA_GDQ_ACCT | XFS_QUOTA_GDQ_ENFD); + if (xarg == NULL) { /* only enfd on/off */ + xopts |= (type == USRQUOTA) ? XFS_QUOTA_UDQ_ENFD : + XFS_QUOTA_GDQ_ENFD; err = xfs_onoff((char *)dev, type, flags, roothack, xopts); } else if (strcmp(xarg, "account") == 0) { From michael.monnerie@is.it-management.at Fri Jun 11 18:35:53 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5BNZqc7168309 for ; Fri, 11 Jun 2010 18:35:52 -0500 X-ASG-Debug-ID: 1276299504-0a8e02860000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9C8453C0B03 for ; Fri, 11 Jun 2010 16:38:24 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id 3RMTynPHNc1NO30f for ; Fri, 11 Jun 2010 16:38:24 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 06AA617C for ; Sat, 12 Jun 2010 01:38:23 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 896CA83C804 for ; Sat, 12 Jun 2010 01:38:19 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair 3.1.2 crashing Subject: Re: xfs_repair 3.1.2 crashing Date: Sat, 12 Jun 2010 01:38:17 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) References: <201006101306.07587@zmi.at> <4C11127C.3030907@sandeen.net> In-Reply-To: <4C11127C.3030907@sandeen.net> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart10730052.8qNjOU9pan"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201006120138.22265@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1276299505 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32279 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart10730052.8qNjOU9pan Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Donnerstag, 10. Juni 2010 Eric Sandeen wrote: > It'd be great to at least capture the issue by creating an > xfs_metadump image for analysis... I sent it to you in private. But now I'm really puzzled: I bought 2 2TB drives, installed an lvm with=20 xfs on them to have 4TB, and copied the contents from the server to=20 these 4TB via rsync -aHAX. And now I have a broken XFS on that brand new=20 created drives, without any crash, not even a reboot! I got this message after making a "du -s" on the new disks: du: cannot access `samba/backup/uranus/WindowsImageBackup/uranus/Backup=20 2010-06-05 010014/852c2690-cf1a-11de-b09b-806e6f6e6963.vhd': Structure=20 needs cleaning So I umounted and xfs_repaired (v3.1.2) it: # xfs_repair -V = =20 xfs_repair version 3.1.2 = =20 # xfs_repair /dev/swraid0/backup=20 Phase 1 - find and verify superblock... =20 Phase 2 - using internal log =20 - zero log... =20 - scan filesystem freespace and inode maps... - found root inode chunk =20 Phase 3 - for each AG... =20 - scan and clear agi unlinked lists... - process known inodes and perform inode discovery... - agno =3D 0 - agno =3D 1 local inode 2195133988 attr too small (size =3D 3, min size =3D 4) bad attribute fork in inode 2195133988, clearing attr fork clearing inode 2195133988 attributes cleared inode 2195133988 - agno =3D 2 - agno =3D 3 - agno =3D 4 - agno =3D 5 - agno =3D 6 - agno =3D 7 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno =3D 2 - agno =3D 4 - agno =3D 5 - agno =3D 6 - agno =3D 7 - agno =3D 3 - agno =3D 1 - agno =3D 0 data fork in inode 2195133988 claims metadata block 537122652 xfs_repair: dinode.c:2101: process_inode_data_fork: Assertion `err =3D=3D 0= '=20 failed. Aborted What's this now? I copied the error from the source via rsync? ;-) =2D-=20 mit freundlichen Gr=FCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=E4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart10730052.8qNjOU9pan Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkwSyO4ACgkQzhSR9xwSCbQ4cQCgla1RssZYXSPqUHu582MfYkqf w4sAn3b5pSxJEBqLQ/uD7ci4CbkZiC5S =OjUM -----END PGP SIGNATURE----- --nextPart10730052.8qNjOU9pan-- From tao.ma@oracle.com Fri Jun 11 18:36:31 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66, UNPARSEABLE_RELAY autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5BNaVZp168345 for ; Fri, 11 Jun 2010 18:36:31 -0500 X-ASG-Debug-ID: 1276299545-07da02890000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from rcsinet10.oracle.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A86A03C0B11 for ; Fri, 11 Jun 2010 16:39:05 -0700 (PDT) Received: from rcsinet10.oracle.com (rcsinet10.oracle.com [148.87.113.121]) by cuda.sgi.com with ESMTP id GREdij0JwM14QOT0 for ; Fri, 11 Jun 2010 16:39:05 -0700 (PDT) Received: from rcsinet15.oracle.com (rcsinet15.oracle.com [148.87.113.117]) by rcsinet10.oracle.com (Switch-3.4.2/Switch-3.4.1) with ESMTP id o5BNctwr007896 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 11 Jun 2010 23:38:57 GMT Received: from acsmt354.oracle.com (acsmt354.oracle.com [141.146.40.154]) by rcsinet15.oracle.com (Switch-3.4.2/Switch-3.4.1) with ESMTP id o5BCJGFp028927; Fri, 11 Jun 2010 23:38:52 GMT Received: from abhmt015.oracle.com by acsmt355.oracle.com with ESMTP id 340473211276299441; Fri, 11 Jun 2010 16:37:21 -0700 Received: from tma-home.cn.oracle.com (/141.144.146.110) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 11 Jun 2010 16:37:21 -0700 Message-ID: <4C12C8BB.50604@oracle.com> Date: Sat, 12 Jun 2010 07:37:31 +0800 From: Tao Ma User-Agent: Mozilla-Thunderbird 2.0.0.22 (X11/20090706) MIME-Version: 1.0 To: Eric Sandeen CC: xfs@oss.sgi.com, Christoph Hellwig , linux-kernel@vger.kernel.org, Alex Elder X-ASG-Orig-Subj: Re: [PATCH] xfs: Make fiemap works with sparse file. Subject: Re: [PATCH] xfs: Make fiemap works with sparse file. References: <1276236135-12051-1-git-send-email-tao.ma@oracle.com> <4C125C0D.4080600@sandeen.net> In-Reply-To: <4C125C0D.4080600@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Auth-Type: Internal IP X-Source-IP: rcsinet15.oracle.com [148.87.113.117] X-CT-RefId: str=0001.0A090201.4C12C911.0196:SCFMA4539811,ss=1,fgs=0 X-Barracuda-Connect: rcsinet10.oracle.com[148.87.113.121] X-Barracuda-Start-Time: 1276299545 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32279 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 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: > Tao Ma wrote: > >> In xfs_vn_fiemap, we set bvm_count to fi_extent_max + 1 and want >> to return fi_extent_max extents, but actually it won't work for >> a sparse file. The reason is that in xfs_getbmap we will >> calculate holes and set it in 'out', while out is malloced by >> bmv_count(fi_extent_max+1) which didn't consider holes. So in the >> worst case, if 'out' vector looks like >> [hole, extent, hole, extent, hole, ... hole, extent, hole], >> we will only return half of fi_extent_max extents. >> >> So in xfs_vn_fiemap, we should consider this worst case. If the >> user wants fi_extent_max extents, we need a 'out' with size of >> 2 *fi_extent_max + 1. >> > > This all seems right to me, though your commit message above (+1) > doesn't match the comment and code in the patch (+2) > oh, yes, I will change the commit log and send a v2. and can I add your ack for this patch? Regards, Tao > -Eric > > >> Cc: Alex Elder >> Cc: Christoph Hellwig >> Cc: Dave Chinner >> Signed-off-by: Tao Ma >> --- >> fs/xfs/linux-2.6/xfs_iops.c | 16 ++++++++++++++-- >> 1 files changed, 14 insertions(+), 2 deletions(-) >> >> diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c >> index 9c8019c..1db92e3 100644 >> --- a/fs/xfs/linux-2.6/xfs_iops.c >> +++ b/fs/xfs/linux-2.6/xfs_iops.c >> @@ -672,9 +672,21 @@ xfs_vn_fiemap( >> else >> bm.bmv_length = BTOBB(length); >> >> - /* We add one because in getbmap world count includes the header */ >> + /* >> + * It is a bit tricky for us to calculate the bmv_count from >> + * fi_extent_max. >> + * If we support to return fi_extent_max extents to the user, >> + * we need at most 2 * fi_extent_max + 1 for bmv_count since >> + * in xfs_getbmap we will calculate holes while fi_extent_max >> + * don't have them. So in the worst case, bmv can looks like >> + * [hole, extent, hole, extent, hole, ... hole, extent, hole]. >> + * So there will be 2 *fi_extent_max + 1. >> + * What's more, in getbmap world count have to include the >> + * header, so we need another bmv. So the total number will >> + * be 2 * fieinfo->fi_extents_max + 2. >> + */ >> bm.bmv_count = !fieinfo->fi_extents_max ? MAXEXTNUM : >> - fieinfo->fi_extents_max + 1; >> + 2 * fieinfo->fi_extents_max + 2; >> bm.bmv_count = min_t(__s32, bm.bmv_count, >> (PAGE_SIZE * 16 / sizeof(struct getbmapx))); >> bm.bmv_iflags = BMV_IF_PREALLOC; >> > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ > From sandeen@sandeen.net Fri Jun 11 18:51:42 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5BNpfGM168884 for ; Fri, 11 Jun 2010 18:51:42 -0500 X-ASG-Debug-ID: 1276300454-0a90030a0000-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 92B483C0C2F for ; Fri, 11 Jun 2010 16:54:15 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id Kb6lzoGSW2Q6QOk8 for ; Fri, 11 Jun 2010 16:54:15 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 5749442B9C52; Fri, 11 Jun 2010 18:54:14 -0500 (CDT) Message-ID: <4C12CCA6.8060700@sandeen.net> Date: Fri, 11 Jun 2010 18:54:14 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: Tao Ma CC: xfs@oss.sgi.com, Christoph Hellwig , linux-kernel@vger.kernel.org, Alex Elder X-ASG-Orig-Subj: Re: [PATCH] xfs: Make fiemap works with sparse file. Subject: Re: [PATCH] xfs: Make fiemap works with sparse file. References: <1276236135-12051-1-git-send-email-tao.ma@oracle.com> <4C125C0D.4080600@sandeen.net> <4C12C8BB.50604@oracle.com> In-Reply-To: <4C12C8BB.50604@oracle.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: 1276300455 X-Barracuda-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.32281 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 Tao Ma wrote: > Eric Sandeen wrote: >> Tao Ma wrote: >> >>> In xfs_vn_fiemap, we set bvm_count to fi_extent_max + 1 and want >>> to return fi_extent_max extents, but actually it won't work for >>> a sparse file. The reason is that in xfs_getbmap we will >>> calculate holes and set it in 'out', while out is malloced by >>> bmv_count(fi_extent_max+1) which didn't consider holes. So in the >>> worst case, if 'out' vector looks like >>> [hole, extent, hole, extent, hole, ... hole, extent, hole], >>> we will only return half of fi_extent_max extents. >>> >>> So in xfs_vn_fiemap, we should consider this worst case. If the >>> user wants fi_extent_max extents, we need a 'out' with size of >>> 2 *fi_extent_max + 1. >>> >> >> This all seems right to me, though your commit message above (+1) >> doesn't match the comment and code in the patch (+2) >> > oh, yes, I will change the commit log and send a v2. > and can I add your ack for this patch? Sure, it seems right to me. Thanks, -Eric > Regards, > Tao >> -Eric >> >> >>> Cc: Alex Elder >>> Cc: Christoph Hellwig >>> Cc: Dave Chinner >>> Signed-off-by: Tao Ma >>> --- >>> fs/xfs/linux-2.6/xfs_iops.c | 16 ++++++++++++++-- >>> 1 files changed, 14 insertions(+), 2 deletions(-) >>> >>> diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c >>> index 9c8019c..1db92e3 100644 >>> --- a/fs/xfs/linux-2.6/xfs_iops.c >>> +++ b/fs/xfs/linux-2.6/xfs_iops.c >>> @@ -672,9 +672,21 @@ xfs_vn_fiemap( >>> else >>> bm.bmv_length = BTOBB(length); >>> >>> - /* We add one because in getbmap world count includes the header */ >>> + /* >>> + * It is a bit tricky for us to calculate the bmv_count from >>> + * fi_extent_max. >>> + * If we support to return fi_extent_max extents to the user, >>> + * we need at most 2 * fi_extent_max + 1 for bmv_count since >>> + * in xfs_getbmap we will calculate holes while fi_extent_max >>> + * don't have them. So in the worst case, bmv can looks like >>> + * [hole, extent, hole, extent, hole, ... hole, extent, hole]. >>> + * So there will be 2 *fi_extent_max + 1. >>> + * What's more, in getbmap world count have to include the >>> + * header, so we need another bmv. So the total number will >>> + * be 2 * fieinfo->fi_extents_max + 2. >>> + */ >>> bm.bmv_count = !fieinfo->fi_extents_max ? MAXEXTNUM : >>> - fieinfo->fi_extents_max + 1; >>> + 2 * fieinfo->fi_extents_max + 2; >>> bm.bmv_count = min_t(__s32, bm.bmv_count, >>> (PAGE_SIZE * 16 / sizeof(struct getbmapx))); >>> bm.bmv_iflags = BMV_IF_PREALLOC; >>> >> >> -- >> To unsubscribe from this list: send the line "unsubscribe >> linux-kernel" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> Please read the FAQ at http://www.tux.org/lkml/ >> > From sandeen@sandeen.net Fri Jun 11 20:36:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5C1a7R8171808 for ; Fri, 11 Jun 2010 20:36:07 -0500 X-ASG-Debug-ID: 1276306720-0287005e0000-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 0A0173C0DF1 for ; Fri, 11 Jun 2010 18:38:40 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id FV9o5IyXa8mvrpgD for ; Fri, 11 Jun 2010 18:38:40 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 4361542B9C49; Fri, 11 Jun 2010 20:38:40 -0500 (CDT) Message-ID: <4C12E520.6040008@sandeen.net> Date: Fri, 11 Jun 2010 20:38:40 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: Michael Monnerie CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair 3.1.2 crashing Subject: Re: xfs_repair 3.1.2 crashing References: <201006101306.07587@zmi.at> <4C11127C.3030907@sandeen.net> <201006120138.22265@zmi.at> In-Reply-To: <201006120138.22265@zmi.at> 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: 1276306721 X-Barracuda-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.32287 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 Michael Monnerie wrote: > On Donnerstag, 10. Juni 2010 Eric Sandeen wrote: >> It'd be great to at least capture the issue by creating an >> xfs_metadump image for analysis... > > I sent it to you in private. > > But now I'm really puzzled: I bought 2 2TB drives, installed an lvm with > xfs on them to have 4TB, and copied the contents from the server to > these 4TB via rsync -aHAX. And now I have a broken XFS on that brand new > created drives, without any crash, not even a reboot! > > I got this message after making a "du -s" on the new disks: > du: cannot access `samba/backup/uranus/WindowsImageBackup/uranus/Backup > 2010-06-05 010014/852c2690-cf1a-11de-b09b-806e6f6e6963.vhd': Structure > needs cleaning dmesg would be the right thing to do here ... > So I umounted and xfs_repaired (v3.1.2) it: > # xfs_repair -V > xfs_repair version 3.1.2 which kernel, again? The fork offset problems smell like something that's fixed. -Eric > # xfs_repair /dev/swraid0/backup > Phase 1 - find and verify superblock... > Phase 2 - using internal log > - zero log... > - scan filesystem freespace and inode maps... > - found root inode chunk > Phase 3 - for each AG... > - scan and clear agi unlinked lists... > - process known inodes and perform inode discovery... > - agno = 0 > - agno = 1 > local inode 2195133988 attr too small (size = 3, min size = 4) > bad attribute fork in inode 2195133988, clearing attr fork > clearing inode 2195133988 attributes > cleared inode 2195133988 > - agno = 2 > - agno = 3 > - agno = 4 > - agno = 5 > - agno = 6 > - agno = 7 > - process newly discovered inodes... > Phase 4 - check for duplicate blocks... > - setting up duplicate extent list... > - check for inodes claiming duplicate blocks... > - agno = 2 > - agno = 4 > - agno = 5 > - agno = 6 > - agno = 7 > - agno = 3 > - agno = 1 > - agno = 0 > data fork in inode 2195133988 claims metadata block 537122652 > xfs_repair: dinode.c:2101: process_inode_data_fork: Assertion `err == 0' > failed. > Aborted > > What's this now? I copied the error from the source via rsync? ;-) > > > > ------------------------------------------------------------------------ > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From tao.ma@oracle.com Fri Jun 11 21:07:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66, UNPARSEABLE_RELAY autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5C27YPo173086 for ; Fri, 11 Jun 2010 21:07:34 -0500 X-ASG-Debug-ID: 1276308607-1f3403cd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from rcsinet10.oracle.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7780714CB63B for ; Fri, 11 Jun 2010 19:10:08 -0700 (PDT) Received: from rcsinet10.oracle.com (rcsinet10.oracle.com [148.87.113.121]) by cuda.sgi.com with ESMTP id rPPYDAUo0ZquLyx4 for ; Fri, 11 Jun 2010 19:10:08 -0700 (PDT) Received: from acsinet15.oracle.com (acsinet15.oracle.com [141.146.126.227]) by rcsinet10.oracle.com (Switch-3.4.2/Switch-3.4.1) with ESMTP id o5C29qcw009872 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 12 Jun 2010 02:09:54 GMT Received: from acsmt355.oracle.com (acsmt355.oracle.com [141.146.40.155]) by acsinet15.oracle.com (Switch-3.4.2/Switch-3.4.1) with ESMTP id o5BHkqiq006020; Sat, 12 Jun 2010 02:09:51 GMT Received: from abhmt015.oracle.com by acsmt353.oracle.com with ESMTP id 319218511276308505; Fri, 11 Jun 2010 19:08:25 -0700 Received: from localhost.localdomain (/10.182.120.191) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 11 Jun 2010 19:08:24 -0700 From: Tao Ma To: xfs@oss.sgi.com Cc: linux-kernel@vger.kernel.org, sandeen@sandeen.net, Tao Ma , Alex Elder , Christoph Hellwig , Dave Chinner X-ASG-Orig-Subj: [PATCH v2] xfs: Make fiemap works with sparse file. Subject: [PATCH v2] xfs: Make fiemap works with sparse file. Date: Sat, 12 Jun 2010 10:08:15 +0800 Message-Id: <1276308495-14267-1-git-send-email-tao.ma@oracle.com> X-Mailer: git-send-email 1.7.0.4 X-Auth-Type: Internal IP X-Source-IP: acsinet15.oracle.com [141.146.126.227] X-CT-RefId: str=0001.0A090205.4C12EC73.00A2:SCFMA922111,ss=1,fgs=0 X-Barracuda-Connect: rcsinet10.oracle.com[148.87.113.121] X-Barracuda-Start-Time: 1276308608 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32289 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean In xfs_vn_fiemap, we set bvm_count to fi_extent_max + 1 and want to return fi_extent_max extents, but actually it won't work for a sparse file. The reason is that in xfs_getbmap we will calculate holes and set it in 'out', while out is malloced by bmv_count(fi_extent_max+1) which didn't consider holes. So in the worst case, if 'out' vector looks like [hole, extent, hole, extent, hole, ... hole, extent, hole], we will only return half of fi_extent_max extents. So in xfs_vn_fiemap, we should consider this worst case. If the user wants fi_extent_max extents, we need a 'out' with size of 2 *fi_extent_max + 2(one more the header). Cc: Alex Elder Cc: Christoph Hellwig Cc: Dave Chinner Acked-by: Eric Sandeen Signed-off-by: Tao Ma --- fs/xfs/linux-2.6/xfs_iops.c | 16 ++++++++++++++-- 1 files changed, 14 insertions(+), 2 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c index 9c8019c..1db92e3 100644 --- a/fs/xfs/linux-2.6/xfs_iops.c +++ b/fs/xfs/linux-2.6/xfs_iops.c @@ -672,9 +672,21 @@ xfs_vn_fiemap( else bm.bmv_length = BTOBB(length); - /* We add one because in getbmap world count includes the header */ + /* + * It is a bit tricky for us to calculate the bmv_count from + * fi_extent_max. + * If we support to return fi_extent_max extents to the user, + * we need at most 2 * fi_extent_max + 1 for bmv_count since + * in xfs_getbmap we will calculate holes while fi_extent_max + * don't have them. So in the worst case, bmv can looks like + * [hole, extent, hole, extent, hole, ... hole, extent, hole]. + * So there will be 2 *fi_extent_max + 1. + * What's more, in getbmap world count have to include the + * header, so we need another bmv. So the total number will + * be 2 * fieinfo->fi_extents_max + 2. + */ bm.bmv_count = !fieinfo->fi_extents_max ? MAXEXTNUM : - fieinfo->fi_extents_max + 1; + 2 * fieinfo->fi_extents_max + 2; bm.bmv_count = min_t(__s32, bm.bmv_count, (PAGE_SIZE * 16 / sizeof(struct getbmapx))); bm.bmv_iflags = BMV_IF_PREALLOC; -- 1.5.5 From ibmirkin@gmail.com Fri Jun 11 23:58:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5C4wKPw178132 for ; Fri, 11 Jun 2010 23:58:20 -0500 X-ASG-Debug-ID: 1276318853-7dcb021d0000-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 DDB3A1B6F7B4 for ; Fri, 11 Jun 2010 22:00:53 -0700 (PDT) Received: from mail-vw0-f53.google.com (mail-vw0-f53.google.com [209.85.212.53]) by cuda.sgi.com with ESMTP id b822CdlI7rYs7j5F for ; Fri, 11 Jun 2010 22:00:53 -0700 (PDT) Received: by vws16 with SMTP id 16so2076299vws.26 for ; Fri, 11 Jun 2010 22:00:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:sender:received :in-reply-to:references:date:x-google-sender-auth:message-id:subject :from:to:cc:content-type; bh=Z50OKoE97cndcmjQLZnNR1bEj7sBkkeh0Tn6LY7vHlw=; b=VS9tuKfmPgQEUffjTEAVYodV52qfHZknJFrAfgiZ7Zk9GUTWt+3fJ5qXyomKsgoglm FWNY1flgfzRXetymGIx4nfT7POlLETX0BNlu6BzIPO3tYSe94gTBNxT86qKWYREkx+td HINb50N3nK5CLEhvwgFeB6ijPwd1sXoyyVCCk= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:cc:content-type; b=xYzA/RgqGov/SvgjyzDjEs4ky5KN85W2vqBfJN/KWF9+tKlVTiEzc0qNXKV9i1cyV9 QKCb8CawdExCPs5q979Eq5kzmZpvg+Wb6GyA2hLcYXJtw28MYyousE2VRGKwduin1HUZ SV8nH7u5P8/4tevKc7hyJpfD3WvrAFycVsxhY= MIME-Version: 1.0 Received: by 10.220.121.140 with SMTP id h12mr284335vcr.170.1276318852344; Fri, 11 Jun 2010 22:00:52 -0700 (PDT) Sender: ibmirkin@gmail.com Received: by 10.220.87.71 with HTTP; Fri, 11 Jun 2010 22:00:52 -0700 (PDT) In-Reply-To: <20100524011907.GC12087@dastard> References: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> <20100523101856.GL2150@dastard> <20100523092344.0fcaab42@aaa.pulp.binarylife.net> <20100524011907.GC12087@dastard> Date: Sat, 12 Jun 2010 01:00:52 -0400 X-Google-Sender-Auth: R6zeX-zAHQgQ0R4HCU6oUtuZNDA Message-ID: X-ASG-Orig-Subj: Re: WARNING in xfs_lwr.c, xfs_write() Subject: Re: WARNING in xfs_lwr.c, xfs_write() From: Ilia Mirkin To: Dave Chinner Cc: Roman Kononov , xfs@oss.sgi.com, linux-kernel@vger.kernel.org Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-vw0-f53.google.com[209.85.212.53] X-Barracuda-Start-Time: 1276318854 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32301 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Sorry to pick up an old-ish thread, but I have a similar situation: On Sun, May 23, 2010 at 9:19 PM, Dave Chinner wrote: > On Sun, May 23, 2010 at 09:23:44AM -0500, Roman Kononov wrote: >> On 2010-05-23, 20:18:56 +1000, Dave Chinner wrote: >> > Can you find out what the application is triggering this? I noticed this happening with mysql and xtrabackup -- the latter opens up mysql's files while mysql is still running (and modifying its own files) and backs them up in a (hopefully) safe way. mysql had been running on the machine without any such warnings for a while before we ran the backup, so I'm pretty sure that the backup is involved, although its process is never listed. Specifically the warning is: [2584257.839386] ------------[ cut here ]------------ [2584257.839395] WARNING: at fs/xfs/linux-2.6/xfs_lrw.c:651 xfs_write+0x3dc/0x784() [2584257.839398] Hardware name: PowerEdge R710 [2584257.839399] Modules linked in: nfsd cifs iTCO_wdt iTCO_vendor_support [2584257.839406] Pid: 7761, comm: mysqld Not tainted 2.6.33-gentoo-r2 #1 [2584257.839407] Call Trace: [2584257.839411] [] ? xfs_write+0x3dc/0x784 [2584257.839415] [] warn_slowpath_common+0x77/0xa4 [2584257.839417] [] warn_slowpath_null+0xf/0x11 [2584257.839419] [] xfs_write+0x3dc/0x784 [2584257.839424] [] ? apic_timer_interrupt+0xe/0x20 [2584257.839427] [] xfs_file_aio_write+0x5a/0x5c [2584257.839430] [] do_sync_write+0xc0/0x106 [2584257.839435] [] ? __fsnotify_parent+0xc7/0xd3 [2584257.839437] [] vfs_write+0xab/0x105 [2584257.839439] [] sys_pwrite64+0x5c/0x7d [2584257.839442] [] system_call_fastpath+0x16/0x1b [2584257.839444] ---[ end trace 8b0c2a6e5e86745f ]--- > Yes, it should be safe, but the kernel code can't know whether this > is true or not - there are no specific interlocks with direct IO to > prevent concurrent buffered IO to the same region while a direct IO > is in progress. XFS does best effort attempts to maintain coherency > does not provide any guarantees, hence the warning when known race > conditions are tripped. Would it be safe to remove the warning at fs/xfs/linux-2.6/xfs_lrw.c:651 (which looks like it has moved to xfs_file.c in 2.6.34)? It seems undesirable to get a long stream of these (51 in this particular instance) every time we run a backup... IOW, is the warning purely something along the lines of "Userspace is doing something wonky, but the underlying FS will still be fine no matter what" kind of deal, or could there be an actual problem with the XFS metadata itself? Thanks for any advice, Ilia Mirkin imirkin@alum.mit.edu From michael.monnerie@is.it-management.at Sat Jun 12 05:39:25 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5CAdOou192726 for ; Sat, 12 Jun 2010 05:39:25 -0500 X-ASG-Debug-ID: 1276339511-33c801ef0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C0F7D12A9F54 for ; Sat, 12 Jun 2010 03:45:12 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id WVs2fVkAgLEuZ2J1 for ; Sat, 12 Jun 2010 03:45:12 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 463562490E for ; Sat, 12 Jun 2010 12:41:54 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id E91EC83C829 for ; Sat, 12 Jun 2010 12:41:49 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair 3.1.2 crashing Subject: Re: xfs_repair 3.1.2 crashing Date: Sat, 12 Jun 2010 12:41:48 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) References: <201006101306.07587@zmi.at> <201006120138.22265@zmi.at> <4C12E520.6040008@sandeen.net> In-Reply-To: <4C12E520.6040008@sandeen.net> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart3390362.PifhOLhOaN"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201006121241.52336@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1276339513 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32323 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart3390362.PifhOLhOaN Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Samstag, 12. Juni 2010 Eric Sandeen wrote: > > du: cannot access > > `samba/backup/uranus/WindowsImageBackup/uranus/Backup 2010-06-05 > > 010014/852c2690-cf1a-11de-b09b-806e6f6e6963.vhd': Structure needs > > cleaning > dmesg would be the right thing to do here ... There are a lot, here the last two: [157312.699958] XFS mounting filesystem dm-0 = = =20 [157312.891010] Ending clean XFS mount for filesystem: dm-0 = = =20 [157340.953238] Filesystem "dm-0": corrupt inode 2195133988 ((a)extents =3D= 5). Unmount and run xfs_repair. = =20 [157340.953250] ffff8800928b6400: 49 4e 81 c0 02 02 00 00 00 00 03 e8 00 00= 00 64 IN.............d = =20 [157340.953268] Filesystem "dm-0": XFS internal error xfs_iformat_extents(1= ) at line 558 of file /usr/src/packages/BUILD/kernel-desktop-2.6.31.12/linu= x-2.6.31/fs/xfs/xfs_inode.c. Caller 0xffffffffa03380ad [157340.953271] = = =20 [157340.953285] Pid: 27034, comm: du Not tainted 2.6.31.12-0.2-desktop #1 = = =20 [157340.953292] Call Trace: = = =20 [157340.953308] [] try_stack_unwind+0x189/0x1b0 = = =20 [157340.953316] [] dump_trace+0xad/0x3a0 = = =20 [157340.953324] [] show_trace_log_lvl+0x64/0x90 = = =20 [157340.953331] [] show_trace+0x23/0x40 = = =20 [157340.953339] [] dump_stack+0x81/0x9e = = =20 [157340.953369] [] xfs_error_report+0x5a/0x70 [xfs] = = =20 [157340.953427] [] xfs_corruption_error+0x6c/0x90 [xfs] = = =20 [157340.953482] [] xfs_iformat_extents+0x234/0x280 [xfs]= = =20 [157340.953543] [] xfs_iformat+0x28d/0x5a0 [xfs] = = =20 [157340.953600] [] xfs_iread+0x182/0x1c0 [xfs] = = =20 [157340.953658] [] xfs_iget_cache_miss+0x78/0x250 [xfs] = = =20 [157340.953712] [] xfs_iget+0x12c/0x1b0 [xfs] = = =20 [157340.953768] [] xfs_lookup+0xce/0x100 [xfs] = = =20 [157340.953843] [] xfs_vn_lookup+0x6c/0xc0 [xfs] = = =20 [157340.953922] [] real_lookup+0x102/0x180 = = =20 [157340.953931] [] do_lookup+0xd0/0x100 = = =20 [157340.953938] [] __link_path_walk+0x522/0x880 = = =20 [157340.953945] [] path_walk+0x66/0xd0 = = =20 [157340.953953] [] do_path_lookup+0x6b/0xb0 = = =20 [157340.953957] [] user_path_at+0x61/0xc0 = = =20 [157340.953962] [] vfs_fstatat+0x41/0x90 = = =20 [157340.953967] [] sys_newfstatat+0x29/0x60 = = =20 [157340.953973] [] system_call_fastpath+0x16/0x1b = = =20 [157340.953986] [<00007fd51c9e50ee>] 0x7fd51c9e50ee = = =20 [157573.164556] Filesystem "dm-0": corrupt inode 2195133988 ((a)extents =3D= 5). Unmount and run xfs_repair. = =20 [157573.164584] ffff8800928b6400: 49 4e 81 c0 02 02 00 00 00 00 03 e8 00 00= 00 64 IN.............d = =20 [157573.164608] Filesystem "dm-0": XFS internal error xfs_iformat_extents(1= ) at line 558 of file /usr/src/packages/BUILD/kernel-desktop-2.6.31.12/linu= x-2.6.31/fs/xfs/xfs_inode.c. Caller 0xffffffffa03380ad [157573.164615] = = =20 [157573.164646] Pid: 27064, comm: du Not tainted 2.6.31.12-0.2-desktop #1 = = =20 [157573.164659] Call Trace: = = =20 [157573.164688] [] try_stack_unwind+0x189/0x1b0 = = =20 [157573.164710] [] dump_trace+0xad/0x3a0 = = =20 [157573.164729] [] show_trace_log_lvl+0x64/0x90 = = =20 [157573.164747] [] show_trace+0x23/0x40 = = =20 [157573.164765] [] dump_stack+0x81/0x9e [157573.164833] [] xfs_error_report+0x5a/0x70 [xfs] [157573.164988] [] xfs_corruption_error+0x6c/0x90 [xfs] [157573.165151] [] xfs_iformat_extents+0x234/0x280 [xfs] [157573.165317] [] xfs_iformat+0x28d/0x5a0 [xfs] [157573.165477] [] xfs_iread+0x182/0x1c0 [xfs] [157573.165640] [] xfs_iget_cache_miss+0x78/0x250 [xfs] [157573.165794] [] xfs_iget+0x12c/0x1b0 [xfs] [157573.165951] [] xfs_lookup+0xce/0x100 [xfs] [157573.166169] [] xfs_vn_lookup+0x6c/0xc0 [xfs] [157573.166366] [] real_lookup+0x102/0x180 [157573.166387] [] do_lookup+0xd0/0x100 [157573.166406] [] __link_path_walk+0x522/0x880 [157573.166425] [] path_walk+0x66/0xd0 [157573.166443] [] do_path_lookup+0x6b/0xb0 [157573.166461] [] user_path_at+0x61/0xc0 [157573.166481] [] vfs_fstatat+0x41/0x90 [157573.166500] [] sys_newfstatat+0x29/0x60 [157573.166520] [] system_call_fastpath+0x16/0x1b [157573.166551] [<00007f63d57480ee>] 0x7f63d57480ee > > xfs_repair version 3.1.2 > which kernel, again? The fork offset problems smell like something > that's fixed. openSUSE 11.2 with it's latest kernel, 2.6.31.12-0.2-desktop But as I said: fresh disks, fresh XFS, copied from another server with rsyn= c, no crashes,=20 not even a reboot. Why the problems? =2D-=20 mit freundlichen Gr=FCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=E4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart3390362.PifhOLhOaN Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkwTZHAACgkQzhSR9xwSCbRfdwCbB36ivGbfEmelU8v7xbdNrDRo 2QgAn1CgWHT4SfQ3Xr2PTA7xbngeN3ae =thCi -----END PGP SIGNATURE----- --nextPart3390362.PifhOLhOaN-- From michael.monnerie@is.it-management.at Sat Jun 12 08:31:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5CDV6PR197823 for ; Sat, 12 Jun 2010 08:31:07 -0500 X-ASG-Debug-ID: 1276349618-643401a80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailsrv14.zmi.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 31F501D59D62 for ; Sat, 12 Jun 2010 06:33:39 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id YsKHCm87BLLWxpoP for ; Sat, 12 Jun 2010 06:33:39 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id DEFEE17D for ; Sat, 12 Jun 2010 15:33:37 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 5952783C829 for ; Sat, 12 Jun 2010 15:33:33 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_repair 3.1.2 crashing Subject: Re: xfs_repair 3.1.2 crashing Date: Sat, 12 Jun 2010 15:33:31 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) References: <201006101306.07587@zmi.at> <201006120138.22265@zmi.at> <4C12E520.6040008@sandeen.net> In-Reply-To: <4C12E520.6040008@sandeen.net> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart2255904.frkgb0dbxY"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201006121533.36684@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1276349620 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE_7582B X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32329 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 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 --nextPart2255904.frkgb0dbxY Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Samstag, 12. Juni 2010 Eric Sandeen wrote: > > I got this message after making a "du -s" on the new disks: > > du: cannot access > > `samba/backup/uranus/WindowsImageBackup/uranus/Backup 2010-06-05 > > 010014/852c2690-cf1a-11de-b09b-806e6f6e6963.vhd': Structure needs > > cleaning >=20 > dmesg would be the right thing to do here ... Here a similar problem on the original server, with the file=20 /disks/daten/samba/tmp/installtemp/askalani-20100526.tib This is the server that crashed, so I forgive XFS the error. It looks the same to me, and I wonder if I triggered a bug somewhere. dmesg says: [167981.222124] Filesystem "dm-0": corrupt inode 2267035928 ((a)extents =3D= 7). Unmount and run xfs_repair. = =20 [167981.222130] ffff8800c068c800: 49 4e 81 fc 02 02 00 00 00 00 04 e5 00 00= 00 64 IN.............d = =20 [167981.222134] Filesystem "dm-0": XFS internal error xfs_iformat_extents(1= ) at line 558 of file /usr/src/packages/BUILD/kernel-xen-2.6.31.12/linux-2.= 6.31/fs/xfs/xfs_inode.c. Caller 0xffffffffa019c44d [167981.222136] = = =20 [167981.222140] Pid: 13802, comm: ls Not tainted 2.6.31.12-0.2-xen #1 = = =20 [167981.222142] Call Trace: = = =20 [167981.222156] [] try_stack_unwind+0x189/0x1b0 = = =20 [167981.222163] [] dump_trace+0xa6/0x1e0 = = =20 [167981.222167] [] show_trace_log_lvl+0x64/0x90 = = =20 [167981.222171] [] show_trace+0x23/0x40 = = =20 [167981.222176] [] dump_stack+0x81/0x9e = = =20 [167981.222213] [] xfs_error_report+0x5a/0x70 [xfs] = = =20 [167981.222309] [] xfs_corruption_error+0x6c/0x90 [xfs] = = =20 [167981.222355] [] xfs_iformat_extents+0x234/0x280 [xfs]= = =20 [167981.222407] [] xfs_iformat+0x28d/0x5a0 [xfs] = = =20 [167981.222458] [] xfs_iread+0x182/0x1c0 [xfs] = = =20 [167981.222541] [] xfs_iget_cache_miss+0x78/0x200 [xfs] = = =20 [167981.222590] [] xfs_iget+0x129/0x1d0 [xfs] = = =20 [167981.222640] [] xfs_lookup+0xce/0x100 [xfs] = = =20 [167981.222711] [] xfs_vn_lookup+0x6c/0xc0 [xfs] = = =20 [167981.222825] [] real_lookup+0x102/0x180 = = =20 [167981.222830] [] do_lookup+0xd0/0x100 = = =20 [167981.222835] [] __link_path_walk+0x7f8/0xf40 = = =20 [167981.222838] [] path_walk+0x66/0xd0 = = =20 [167981.222842] [] do_path_lookup+0x6b/0xb0 = = =20 [167981.222846] [] user_path_at+0x61/0xc0 = = =20 [167981.222850] [] vfs_fstatat+0x41/0x90 = = =20 [167981.222853] [] vfs_lstat+0x2c/0x50 = = =20 [167981.222857] [] sys_newlstat+0x2e/0x70 = = =20 [167981.222861] [] system_call_fastpath+0x16/0x1b = = =20 [167981.222870] [<00007f9decb1ce65>] 0x7f9decb1ce65 =20 = =20 [167985.423311] Filesystem "dm-0": corrupt inode 2267035928 ((a)extents =3D= 7). Unmount and run xfs_repair. = =20 [167985.423317] ffff8800c068c800: 49 4e 81 fc 02 02 00 00 00 00 04 e5 00 00= 00 64 IN.............d = =20 [167985.423322] Filesystem "dm-0": XFS internal error xfs_iformat_extents(1= ) at line 558 of file /usr/src/packages/BUILD/kernel-xen-2.6.31.12/linux-2.= 6.31/fs/xfs/xfs_inode.c. Caller 0xffffffffa019c44d [167985.423324] = = =20 [167985.423328] Pid: 13803, comm: ls Not tainted 2.6.31.12-0.2-xen #1 = = =20 [167985.423330] Call Trace: [167985.423344] [] try_stack_unwind+0x189/0x1b0 [167985.423397] [] dump_trace+0xa6/0x1e0 [167985.423402] [] show_trace_log_lvl+0x64/0x90 [167985.423406] [] show_trace+0x23/0x40 [167985.423411] [] dump_stack+0x81/0x9e [167985.423446] [] xfs_error_report+0x5a/0x70 [xfs] [167985.423495] [] xfs_corruption_error+0x6c/0x90 [xfs] [167985.423538] [] xfs_iformat_extents+0x234/0x280 [xfs] [167985.423588] [] xfs_iformat+0x28d/0x5a0 [xfs] [167985.423636] [] xfs_iread+0x182/0x1c0 [xfs] [167985.423727] [] xfs_iget_cache_miss+0x78/0x200 [xfs] [167985.423775] [] xfs_iget+0x129/0x1d0 [xfs] [167985.423824] [] xfs_lookup+0xce/0x100 [xfs] [167985.423924] [] xfs_vn_lookup+0x6c/0xc0 [xfs] [167985.423985] [] real_lookup+0x102/0x180 [167985.423991] [] do_lookup+0xd0/0x100 [167985.423995] [] __link_path_walk+0x7f8/0xf40 [167985.423999] [] path_walk+0x66/0xd0 [167985.424003] [] do_path_lookup+0x6b/0xb0 [167985.424007] [] user_path_at+0x61/0xc0 [167985.424011] [] vfs_fstatat+0x41/0x90 [167985.424014] [] vfs_lstat+0x2c/0x50 [167985.424018] [] sys_newlstat+0x2e/0x70 [167985.424022] [] system_call_fastpath+0x16/0x1b [167985.424031] [<00007f56f3525e65>] 0x7f56f3525e65 =2D-=20 mit freundlichen Gr=FCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=E4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart2255904.frkgb0dbxY Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.12 (GNU/Linux) iEYEABECAAYFAkwTjLAACgkQzhSR9xwSCbRdIwCbBFHSaOFKFd2edZZP37N7nSbS 6vUAn1uEnz3tQQf3ZgTmkGO5ake8ywYM =x30q -----END PGP SIGNATURE----- --nextPart2255904.frkgb0dbxY-- From officer.info@loanofficer.com Sat Jun 12 14:52:27 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.0 required=5.0 tests=BAYES_99 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5CJqRgW215074 for ; Sat, 12 Jun 2010 14:52:27 -0500 X-ASG-Debug-ID: 1276372499-2c0500090000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.prestige.lk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D8CFC1B725A7 for ; Sat, 12 Jun 2010 12:55:00 -0700 (PDT) Received: from mail.prestige.lk (mail.prestige.lk [122.255.5.178]) by cuda.sgi.com with ESMTP id B62lpj24rk62BK3z for ; Sat, 12 Jun 2010 12:55:00 -0700 (PDT) Received: from mail.prestige.lk (mail.prestige.lk [127.0.0.1]) by mail.prestige.lk (Postfix) with ESMTP id BD88C40C280; Sat, 12 Jun 2010 23:35:16 +0530 (IST) Received: from 116.197.92.85 (SquirrelMail authenticated user spam) by mail.prestige.lk with HTTP; Sat, 12 Jun 2010 23:35:16 +0530 (IST) Message-ID: <52791.116.197.92.85.1276365916.squirrel@mail.prestige.lk> Date: Sat, 12 Jun 2010 23:35:16 +0530 (IST) X-ASG-Orig-Subj: Subject: From: "Financial Source" Reply-To: intloans@rediffmail.com User-Agent: SquirrelMail/1.4.11-1.fc8 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal To: undisclosed-recipients:; X-ISP-MailScanner-Information: Please contact the ISP for more information X-ISP-MailScanner-ID: BD88C40C280.061CB X-ISP-MailScanner: Found to be clean X-ISP-MailScanner-From: officer.info@loanofficer.com X-Barracuda-Connect: mail.prestige.lk[122.255.5.178] X-Barracuda-Start-Time: 1276372501 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4232 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.29 X-Barracuda-Spam-Status: No, SCORE=1.29 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_SUBJECT, MISSING_SUBJECT_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32355 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 MISSING_SUBJECT Missing Subject: header 1.28 MISSING_SUBJECT_2 Missing Subject: header X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Are you in debt? Need a loan? personal or business? with low rates, high approvals and flexible terms/conditions? check out: S.C Int. Financial Source:- We offer loans to all regardless of their financial status. Loans includes both: Personal loans & business loans, investment capital and refinancing of all kinds. To apply, contact us now Via e-mail: Email: intloans@rediffmail.com Visit our website for more details...lk -- This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean. From SRS0+rtpy+13+fromorbit.com=david@internode.on.net Sun Jun 13 17:45:26 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5DMjPGk007222 for ; Sun, 13 Jun 2010 17:45:26 -0500 X-ASG-Debug-ID: 1276469279-08a501e10000-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 2B0203C367A for ; Sun, 13 Jun 2010 15:47:59 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id re6qNPeGE6hWfrkv for ; Sun, 13 Jun 2010 15:47:59 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 16186656-1927428 for multiple; Mon, 14 Jun 2010 08:17:54 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1ONvy4-0001h6-9T; Mon, 14 Jun 2010 08:47:52 +1000 Date: Mon, 14 Jun 2010 08:47:52 +1000 From: Dave Chinner To: Ilia Mirkin Cc: Roman Kononov , xfs@oss.sgi.com, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: Re: WARNING in xfs_lwr.c, xfs_write() Subject: Re: WARNING in xfs_lwr.c, xfs_write() Message-ID: <20100613224752.GA2069@dastard> References: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> <20100523101856.GL2150@dastard> <20100523092344.0fcaab42@aaa.pulp.binarylife.net> <20100524011907.GC12087@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1276469281 X-Barracuda-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.32459 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, Jun 12, 2010 at 01:00:52AM -0400, Ilia Mirkin wrote: > Sorry to pick up an old-ish thread, but I have a similar situation: > > On Sun, May 23, 2010 at 9:19 PM, Dave Chinner wrote: > > On Sun, May 23, 2010 at 09:23:44AM -0500, Roman Kononov wrote: > >> On 2010-05-23, 20:18:56 +1000, Dave Chinner wrote: > >> > Can you find out what the application is triggering this? > > I noticed this happening with mysql and xtrabackup -- the latter opens > up mysql's files while mysql is still running (and modifying its own > files) and backs them up in a (hopefully) safe way. That's not safe at all - there's no guarantee you'll end up with a consistent database image doing backups like this. Have you ever tried to restore and use one of these backups? > mysql had been > running on the machine without any such warnings for a while before we > ran the backup, so I'm pretty sure that the backup is involved, > although its process is never listed. Specifically the warning is: > > [2584257.839386] ------------[ cut here ]------------ > [2584257.839395] WARNING: at fs/xfs/linux-2.6/xfs_lrw.c:651 > xfs_write+0x3dc/0x784() > [2584257.839398] Hardware name: PowerEdge R710 > [2584257.839399] Modules linked in: nfsd cifs iTCO_wdt iTCO_vendor_support > [2584257.839406] Pid: 7761, comm: mysqld Not tainted 2.6.33-gentoo-r2 #1 > [2584257.839407] Call Trace: > [2584257.839411] [] ? xfs_write+0x3dc/0x784 > [2584257.839415] [] warn_slowpath_common+0x77/0xa4 > [2584257.839417] [] warn_slowpath_null+0xf/0x11 > [2584257.839419] [] xfs_write+0x3dc/0x784 > [2584257.839424] [] ? apic_timer_interrupt+0xe/0x20 > [2584257.839427] [] xfs_file_aio_write+0x5a/0x5c > [2584257.839430] [] do_sync_write+0xc0/0x106 > [2584257.839435] [] ? __fsnotify_parent+0xc7/0xd3 > [2584257.839437] [] vfs_write+0xab/0x105 > [2584257.839439] [] sys_pwrite64+0x5c/0x7d > [2584257.839442] [] system_call_fastpath+0x16/0x1b > [2584257.839444] ---[ end trace 8b0c2a6e5e86745f ]--- > > > Yes, it should be safe, but the kernel code can't know whether this > > is true or not - there are no specific interlocks with direct IO to > > prevent concurrent buffered IO to the same region while a direct IO > > is in progress. XFS does best effort attempts to maintain coherency > > does not provide any guarantees, hence the warning when known race > > conditions are tripped. > > Would it be safe to remove the warning at > fs/xfs/linux-2.6/xfs_lrw.c:651 (which looks like it has moved to > xfs_file.c in 2.6.34)? It seems undesirable to get a long stream of > these (51 in this particular instance) every time we run a backup... You can if you want, but then you won't know when your backup or database might have been corrupted, right? > IOW, is the warning purely something along the lines of "Userspace is > doing something wonky, but the underlying FS will still be fine no > matter what" kind of deal, or could there be an actual problem with > the XFS metadata itself? Nothing wrong with the filesystem metadata will occur - as I said eariler in the thread that this is a warning to tell us that data corruption is possible due to userspace doing something stupid, not a filesystem bug. Cheers, Dave. -- Dave Chinner david@fromorbit.com From ibmirkin@gmail.com Sun Jun 13 18:07:57 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5DN7uMP008721 for ; Sun, 13 Jun 2010 18:07:57 -0500 X-ASG-Debug-ID: 1276470835-14f900900000-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 71D5612ABE63 for ; Sun, 13 Jun 2010 16:13:56 -0700 (PDT) Received: from mail-vw0-f53.google.com (mail-vw0-f53.google.com [209.85.212.53]) by cuda.sgi.com with ESMTP id Sn0iF2qgAAT91Fj0 for ; Sun, 13 Jun 2010 16:13:56 -0700 (PDT) Received: by vws19 with SMTP id 19so94927vws.26 for ; Sun, 13 Jun 2010 16:10:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:sender:received :in-reply-to:references:date:x-google-sender-auth:message-id:subject :from:to:cc:content-type; bh=x6XqrVM9IuIClON5EkK5hyikJvmPyLVhAknJGhq7IvA=; b=bIY9sowZIEkS2V5vOOWYyIHpO5oS+GVMATlyPjCoF9QgrtjTz34vYF6JvFGycJEEeq ZkJLMXvTyVvf/hRwaJ20rRiI3agitY7CZY0UmGjSgkZXxsq/3sHbm/VFb6p4BnK4EnMT 0nasqIHCezhwEGLjLwxqBsKJwGdEi4fd3q6aM= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:cc:content-type; b=A1y73tOdKamrBU7R0GG6Zc5KRf3TNN+uCYucVQhtq90tCTgB0iGorzgMk4mqsI1uV1 dluIA7mb21dE0sl0hEObzmYBGavKlMA6mtb6anP10Kg9Pf6uxFLh/OALzu0GLjRMTlIz VQYsj0dKXQtFOc8KU28KgRU2FzWUNrLCflNW8= MIME-Version: 1.0 Received: by 10.220.63.4 with SMTP id z4mr2256655vch.105.1276470630239; Sun, 13 Jun 2010 16:10:30 -0700 (PDT) Sender: ibmirkin@gmail.com Received: by 10.220.87.71 with HTTP; Sun, 13 Jun 2010 16:10:30 -0700 (PDT) In-Reply-To: <20100613224752.GA2069@dastard> References: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> <20100523101856.GL2150@dastard> <20100523092344.0fcaab42@aaa.pulp.binarylife.net> <20100524011907.GC12087@dastard> <20100613224752.GA2069@dastard> Date: Sun, 13 Jun 2010 19:10:30 -0400 X-Google-Sender-Auth: sTsrjJNEjS2_Cw_TtywoeesLZPs Message-ID: X-ASG-Orig-Subj: Re: WARNING in xfs_lwr.c, xfs_write() Subject: Re: WARNING in xfs_lwr.c, xfs_write() From: Ilia Mirkin To: Dave Chinner Cc: Roman Kononov , xfs@oss.sgi.com, linux-kernel@vger.kernel.org Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-vw0-f53.google.com[209.85.212.53] X-Barracuda-Start-Time: 1276470836 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.32462 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sun, Jun 13, 2010 at 6:47 PM, Dave Chinner wrote: > On Sat, Jun 12, 2010 at 01:00:52AM -0400, Ilia Mirkin wrote: >> Sorry to pick up an old-ish thread, but I have a similar situation: >> >> On Sun, May 23, 2010 at 9:19 PM, Dave Chinner wrote: >> > On Sun, May 23, 2010 at 09:23:44AM -0500, Roman Kononov wrote: >> >> On 2010-05-23, 20:18:56 +1000, Dave Chinner wrote: >> >> > Can you find out what the application is triggering this? >> >> I noticed this happening with mysql and xtrabackup -- the latter opens >> up mysql's files while mysql is still running (and modifying its own >> files) and backs them up in a (hopefully) safe way. > > That's not safe at all - there's no guarantee you'll end up with a > consistent database image doing backups like this. Have you ever > tried to restore and use one of these backups? Yep, works great. [Used it to initialize a slave, did the full checksums, so it's unlikely to have randomly corrupt data.] It's the only credible way to backup a sizeable mysql db, since it works online with InnoDB; the other options involve either only using MyISAM (non-transactional) or locking the db for the duration (we couldn't wait that long, but attempting to do it on a backup machine looked like it was going to take somewhere between 3 and 7 days, although we gave up after 24 hours... not something we can afford to do with any kind of regularity). >> >> Would it be safe to remove the warning at >> fs/xfs/linux-2.6/xfs_lrw.c:651 (which looks like it has moved to >> xfs_file.c in 2.6.34)? It seems undesirable to get a long stream of >> these (51 in this particular instance) every time we run a backup... > > You can if you want, but then you won't know when your backup or > database might have been corrupted, right? No, but I wouldn't know that without the warnings either -- for all I know xtrabackup could be buggy in all kinds of ways. The only real way to check is to use the backup data in some way. > >> IOW, is the warning purely something along the lines of "Userspace is >> doing something wonky, but the underlying FS will still be fine no >> matter what" kind of deal, or could there be an actual problem with >> the XFS metadata itself? > > Nothing wrong with the filesystem metadata will occur - as I said > eariler in the thread that this is a warning to tell us that data > corruption is possible due to userspace doing something stupid, not > a filesystem bug. OK, thanks for the clarification. Ideally these wouldn't taint the kernel either -- perhaps these can be downgraded to a message that explicitly suggests that nothing is wrong with kernel-space things, only user-space? The backtrace doesn't really get you much, so really all you want to show is the offending process... Thanks, Ilia Mirkin imirkin@alum.mit.edu From SRS0+JKmZ+14+fromorbit.com=david@internode.on.net Sun Jun 13 19:25:00 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_28 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5E0P0Kw011098 for ; Sun, 13 Jun 2010 19:25:00 -0500 X-ASG-Debug-ID: 1276475253-2fee028f0000-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 4F0841BDA109 for ; Sun, 13 Jun 2010 17:27:33 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id WCxHSlAM2KWIRDRo for ; Sun, 13 Jun 2010 17:27:33 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27624179-1927428 for multiple; Mon, 14 Jun 2010 09:57:07 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1ONxW6-0001lK-2I; Mon, 14 Jun 2010 10:27:06 +1000 Date: Mon, 14 Jun 2010 10:27:06 +1000 From: Dave Chinner To: Tao Ma Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org, sandeen@sandeen.net, Alex Elder , Christoph Hellwig X-ASG-Orig-Subj: Re: [PATCH v2] xfs: Make fiemap works with sparse file. Subject: Re: [PATCH v2] xfs: Make fiemap works with sparse file. Message-ID: <20100614002705.GA6590@dastard> References: <1276308495-14267-1-git-send-email-tao.ma@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1276308495-14267-1-git-send-email-tao.ma@oracle.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail17.adl2.internode.on.net[150.101.137.102] X-Barracuda-Start-Time: 1276475255 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32467 Rule breakdown below pts rule 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, Jun 12, 2010 at 10:08:15AM +0800, Tao Ma wrote: > In xfs_vn_fiemap, we set bvm_count to fi_extent_max + 1 and want > to return fi_extent_max extents, but actually it won't work for > a sparse file. Define "won't work". i.e. what's the test case? I just created a sparse file and checked it, and it reported all the extents in it: # xfs_bmap -vp testfile testfile: EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL FLAGS 0: [0..7]: hole 8 1: [8..15]: 96..103 0 (96..103) 8 00000 2: [16..23]: hole 8 3: [24..31]: 112..119 0 (112..119) 8 00000 4: [32..39]: hole 8 5: [40..47]: 128..135 0 (128..135) 8 00000 6: [48..55]: hole 8 7: [56..63]: 144..151 0 (144..151) 8 00000 8: [64..71]: hole 8 9: [72..79]: 160..167 0 (160..167) 8 00000 10: [80..87]: hole 8 11: [88..95]: 176..183 0 (176..183) 8 00000 12: [96..103]: hole 8 13: [104..111]: 192..199 0 (192..199) 8 00000 14: [112..119]: hole 8 15: [120..127]: 208..215 0 (208..215) 8 00000 # filefrag -v testfile Filesystem type is: 58465342 File size of testfile is 65536 (16 blocks, blocksize 4096) ext logical physical expected length flags 0 1 12 1 1 3 14 12 1 2 5 16 14 1 3 7 18 16 1 4 9 20 18 1 5 11 22 20 1 6 13 24 22 1 7 15 26 24 1 eof testfile: 9 extents found # FWIW, filefrag seems busted - the file has 8 extents, not 9. For a more fragmented sparse file (25,000 extents): # for i in `seq 1 2 50000`; do dd if=/dev/zero of=testfile bs=4k count=1 seek=$i; done .... # xfs_bmap -vp testfile | grep -v hole | wc -l 25002 # filefrag -v testfile |tail -1 testfile: 25001 extents found So taking away the 2 header lines from xfs_bmap output we have 25000 extents, and filefrag has over-counted by one again. However, we are we are definitely finding all the extents through fiemap... > The reason is that in xfs_getbmap we will > calculate holes and set it in 'out', while out is malloced by > bmv_count(fi_extent_max+1) which didn't consider holes. So in the > worst case, if 'out' vector looks like > [hole, extent, hole, extent, hole, ... hole, extent, hole], > we will only return half of fi_extent_max extents. Right, it's not broken, we simply return less than fi_extent_mex extents when there are holes. I don't see that as a problem as applications have to handle that case anyway, and.... > So in xfs_vn_fiemap, we should consider this worst case. If the > user wants fi_extent_max extents, we need a 'out' with size of > 2 *fi_extent_max + 2(one more the header). That's rather dangerous, I think. It relies on other code to catch the buffer overrun that this sets up for fragmented, non-sparse files. Personally I'd much prefer to return fewer extents for sparse files than to add a landmine like this into the kernel code.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+wWFy+14+fromorbit.com=david@internode.on.net Sun Jun 13 20:27:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5E1R6qV013123 for ; Sun, 13 Jun 2010 20:27:07 -0500 X-ASG-Debug-ID: 1276478979-758402c00000-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 5C3AA1BDA31A for ; Sun, 13 Jun 2010 18:29:40 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id jCvHy3O6EqwW6mFh for ; Sun, 13 Jun 2010 18:29:40 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27909122-1927428 for multiple; Mon, 14 Jun 2010 10:59:35 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1ONyUX-0001o0-Hg; Mon, 14 Jun 2010 11:29:33 +1000 Date: Mon, 14 Jun 2010 11:29:33 +1000 From: Dave Chinner To: Ilia Mirkin Cc: Roman Kononov , xfs@oss.sgi.com, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: Re: WARNING in xfs_lwr.c, xfs_write() Subject: Re: WARNING in xfs_lwr.c, xfs_write() Message-ID: <20100614012933.GB6590@dastard> References: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> <20100523101856.GL2150@dastard> <20100523092344.0fcaab42@aaa.pulp.binarylife.net> <20100524011907.GC12087@dastard> <20100613224752.GA2069@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1276478981 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32471 Rule breakdown below pts rule 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, Jun 13, 2010 at 07:10:30PM -0400, Ilia Mirkin wrote: > On Sun, Jun 13, 2010 at 6:47 PM, Dave Chinner wrote: > > On Sat, Jun 12, 2010 at 01:00:52AM -0400, Ilia Mirkin wrote: > >> Sorry to pick up an old-ish thread, but I have a similar situation: > >> > >> On Sun, May 23, 2010 at 9:19 PM, Dave Chinner wrote: > >> > On Sun, May 23, 2010 at 09:23:44AM -0500, Roman Kononov wrote: > >> >> On 2010-05-23, 20:18:56 +1000, Dave Chinner wrote: > >> >> > Can you find out what the application is triggering this? > >> > >> I noticed this happening with mysql and xtrabackup -- the latter opens > >> up mysql's files while mysql is still running (and modifying its own > >> files) and backs them up in a (hopefully) safe way. > > > > That's not safe at all - there's no guarantee you'll end up with a > > consistent database image doing backups like this. Have you ever > > tried to restore and use one of these backups? > > Yep, works great. [Used it to initialize a slave, did the full > checksums, so it's unlikely to have randomly corrupt data.] You were lucky, I'd say. xtrabackup is supposed to be tightly integrated with mysql, so perhaps it should be using the same IO methods that the admin has selected for their database. Maybe you need to talk to the xtrabackup folks to get them to add a "backup via direct IO" method if the mysql database is using direct IO so that other uses don't have the same issues. > >> Would it be safe to remove the warning at > >> fs/xfs/linux-2.6/xfs_lrw.c:651 (which looks like it has moved to > >> xfs_file.c in 2.6.34)? It seems undesirable to get a long stream of > >> these (51 in this particular instance) every time we run a backup... > > > > You can if you want, but then you won't know when your backup or > > database might have been corrupted, right? > > No, but I wouldn't know that without the warnings either -- for all I > know xtrabackup could be buggy in all kinds of ways. The only real way > to check is to use the backup data in some way. Yup, but you still can't rely on the backup for disaster recovery without first doing a full application level consistency check it if one of these warnings was generated while it was being taken. > >> IOW, is the warning purely something along the lines of "Userspace is > >> doing something wonky, but the underlying FS will still be fine no > >> matter what" kind of deal, or could there be an actual problem with > >> the XFS metadata itself? > > > > Nothing wrong with the filesystem metadata will occur - as I said > > eariler in the thread that this is a warning to tell us that data > > corruption is possible due to userspace doing something stupid, not > > a filesystem bug. > > OK, thanks for the clarification. Ideally these wouldn't taint the > kernel either Why not? Something has potentially compromised the integrity of the system and that's exactly what the taint flag is there for. > -- perhaps these can be downgraded to a message that > explicitly suggests that nothing is wrong with kernel-space things, > only user-space? The backtrace doesn't really get you much, so really > all you want to show is the offending process... They are there to be meaningful to the XFS developer, not the user, and it conveys all the information we need to start a deeper investigation. IOWs, it's a defensive mechanism that we have in place because direct IO is effectively handing responsibility for data integrity to userspace. Hence when userspace is doing something obviously dangerous to data integrity we want loud, noticable warnings so that the filesystem is not blamed for the data corruption that will inevitably occur. And from a "I read it on the interwebs so it must be true" perspective, without a loud obnoxious warning we'll never hear about problems until someone flames us about silent data corruption on a random blog that gets slashdotted and then referenced for the next 10 years as the next canonical "XFS eats my data!" reference for the clueless.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From ibmirkin@gmail.com Sun Jun 13 22:25:25 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5E3POu4016745 for ; Sun, 13 Jun 2010 22:25:24 -0500 X-ASG-Debug-ID: 1276486079-698101030000-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 2FC0714CC22E for ; Sun, 13 Jun 2010 20:27:59 -0700 (PDT) Received: from mail-vw0-f53.google.com (mail-vw0-f53.google.com [209.85.212.53]) by cuda.sgi.com with ESMTP id MFVXqZ6Lb9xAtDZk for ; Sun, 13 Jun 2010 20:27:59 -0700 (PDT) Received: by vws19 with SMTP id 19so344450vws.26 for ; Sun, 13 Jun 2010 20:27:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:sender:received :in-reply-to:references:date:x-google-sender-auth:message-id:subject :from:to:cc:content-type:content-transfer-encoding; bh=0NPiPc4Bp06OcEINEzAqtATq6Y4Zo1y5dnVoAYnP+5o=; b=XsdcEOegZ+BFMPasgBkJjYJf73tdCwLB37J3oGnVQn73MOOafGLO51OPZ7r9Y9irD8 GL2fn3FIWzCGRiU+h2w4yQEbnIQ/LjE9dJszrsGOdhl2Sg928HQXSKZS4Vnr5DLKOpv/ kno8oUgGyty/C+vg1LLIE/QB4l9DBIeKv3YHY= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:cc:content-type :content-transfer-encoding; b=UM7qZbeXd912Fi0XGXNKFV5F4Ur+Wikxu8uGDRLsShTAy0t8W/xDJIj9bdCvxOfL82 5z1o3BoOWRppyVqUISsTCXEO9oWI9ms/EvbGeNFxOG0rsJfopcENg3M/ZvamdzZjrCQ8 f2/tPZvhgCix+SREnmInmBO5m0vUclw4RAP+g= MIME-Version: 1.0 Received: by 10.220.121.210 with SMTP id i18mr2362110vcr.148.1276486079059; Sun, 13 Jun 2010 20:27:59 -0700 (PDT) Sender: ibmirkin@gmail.com Received: by 10.220.87.71 with HTTP; Sun, 13 Jun 2010 20:27:59 -0700 (PDT) In-Reply-To: <20100614012933.GB6590@dastard> References: <20100523002023.41f5a5c8@aaa.pulp.binarylife.net> <20100523101856.GL2150@dastard> <20100523092344.0fcaab42@aaa.pulp.binarylife.net> <20100524011907.GC12087@dastard> <20100613224752.GA2069@dastard> <20100614012933.GB6590@dastard> Date: Sun, 13 Jun 2010 23:27:59 -0400 X-Google-Sender-Auth: 5mJr9-OUf7xUK9yLZLA4q3U9Dm0 Message-ID: X-ASG-Orig-Subj: Re: WARNING in xfs_lwr.c, xfs_write() Subject: Re: WARNING in xfs_lwr.c, xfs_write() From: Ilia Mirkin To: Dave Chinner Cc: Roman Kononov , xfs@oss.sgi.com, linux-kernel@vger.kernel.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-vw0-f53.google.com[209.85.212.53] X-Barracuda-Start-Time: 1276486080 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.32479 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sun, Jun 13, 2010 at 9:29 PM, Dave Chinner wrote: > On Sun, Jun 13, 2010 at 07:10:30PM -0400, Ilia Mirkin wrote: >> On Sun, Jun 13, 2010 at 6:47 PM, Dave Chinner wrot= e: >> > On Sat, Jun 12, 2010 at 01:00:52AM -0400, Ilia Mirkin wrote: >> >> Sorry to pick up an old-ish thread, but I have a similar situation: >> >> >> >> On Sun, May 23, 2010 at 9:19 PM, Dave Chinner w= rote: >> >> > On Sun, May 23, 2010 at 09:23:44AM -0500, Roman Kononov wrote: >> >> >> On 2010-05-23, 20:18:56 +1000, Dave Chinner = wrote: >> >> >> > Can you find out what the application is triggering this? >> >> >> >> I noticed this happening with mysql and xtrabackup -- the latter open= s >> >> up mysql's files while mysql is still running (and modifying its own >> >> files) and backs them up in a (hopefully) safe way. >> > >> > That's not safe at all - there's no guarantee you'll end up with a >> > consistent database image doing backups like this. Have you ever >> > tried to restore and use one of these backups? >> >> Yep, works great. [Used it to initialize a slave, did the full >> checksums, so it's unlikely to have randomly corrupt data.] > > You were lucky, I'd say. =A0xtrabackup is supposed to be tightly > integrated with mysql, so perhaps it should be using the same IO > methods that the admin has selected for their database. Maybe you > need to talk to the xtrabackup folks to get them to add a "backup > via direct IO" method if the mysql database is using direct IO so > that other uses don't have the same issues. Maybe. We've been using this technique, although on a different physical machine and with ext3, for quite some time (and we verify all backups). I did notice that there is a minor difference in configuration, esp wrt direct IO, so I'll check it out in more detail. [We're now setting innodb_flush_method to O_DIRECT whereas we weren't before... although based on the documentation and a cursory understanding of how xtrabackup works, this shouldn't be harmful.] > And from a "I read it on the interwebs so it must be true" > perspective, without a loud obnoxious warning we'll never hear about > problems until someone flames us about silent data corruption on a > random blog that gets slashdotted and then referenced for the next > 10 years as the next canonical "XFS eats my data!" reference for the > clueless.... Instead it will be "mysql works fine on ext3, but with xfs it spams the logs with warnings, therefore xfs must be broken". I don't think there's anything realistically that you can do about uninformed users and FUD. Although I wasn't suggesting to get rid of the warning, rather to make it more explicit as to what it's warning about. I interpret a WARN as a BUG that can be recovered but where the underlying system needs a careful look; my first inclination after seeing a fs-related WARN would be to take the system down and run an fsck. What's happening here seems more akin to getting a WARN when calling an ioctl with invalid parameters. --- Ilia Mirkin imirkin@alum.mit.edu From SRS0+scHK+14+fromorbit.com=david@internode.on.net Sun Jun 13 23:25:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_63, J_CHICKENPOX_65,J_CHICKENPOX_73 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5E4PBSt019851 for ; Sun, 13 Jun 2010 23:25:11 -0500 X-ASG-Debug-ID: 1276489664-694f00e10000-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 A25553C3B93 for ; Sun, 13 Jun 2010 21:27:45 -0700 (PDT) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id 8XqUuHUUdycX80IG for ; Sun, 13 Jun 2010 21:27:45 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27673154-1927428 for multiple; Mon, 14 Jun 2010 13:57:02 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OO1GG-0001vn-9P; Mon, 14 Jun 2010 14:27:00 +1000 Date: Mon, 14 Jun 2010 14:27:00 +1000 From: Dave Chinner To: Andi Kleen Cc: xfs@oss.sgi.com, akpm@linux-foundation.org, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: Re: [PATCH] [16/23] XFS: Fix gcc 4.6 set but not read and unused statement warnings Subject: Re: [PATCH] [16/23] XFS: Fix gcc 4.6 set but not read and unused statement warnings Message-ID: <20100614042700.GC6590@dastard> References: <20100610110.764742110@firstfloor.org> <20100610111052.3DDC5B1A2B@basil.firstfloor.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100610111052.3DDC5B1A2B@basil.firstfloor.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1276489666 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32483 Rule breakdown below pts rule 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, Jun 10, 2010 at 01:10:52PM +0200, Andi Kleen wrote: > > For my configuration, that is without quota or RT. > > Mostly dead code removed I think (but needs additional review) > > That is there were one or two bad error handling cases, > but they were not easily fixable, with comments > and I left the warnings in for those for you to remember. > > e.g. if there is a ENOSPC down in xfs_trans.c while > modifying the superblock it would not be handled. See my comments about these below. > Unused statements were mostly related to stub macros for disabled > features like QUOTA or RT ALLOC. I replace those with > inlines. Did you compile with/without XFS_DEBUG (I don't think so)? when changing code that affects ASSERT statements, CONFIG_XFS_DEBUG needs to be selected to test that this code compiles. Most XFs developers build with XFS_CONFIG_DEBUG for everything other than performance testing, so ensuring this builds is definitely required. ;) I'd also be interested if any fixes are needed with all options enabled. Seems silly just to fix a few warnings in just one particular configuration rather than all of them... > There were also some problems with variables used in ASSERT() > I partly moved those into the ASSERT itself and partly > used a new QASSERT that always evaluates. That's a pretty ugly hack for a single occurrence of a warning. Re-arrnaging the code is a much better idea than introducing a new ASSERT type. e.g: - ASSERT(ref >= 0); + if (ref < 0) + ASSERT(0); > Cc: xfs@oss.sgi.com > > Signed-off-by: Andi Kleen > > --- > fs/xfs/linux-2.6/xfs_sync.c | 3 +++ > fs/xfs/support/debug.h | 4 ++++ > fs/xfs/xfs_alloc.c | 10 +++------- > fs/xfs/xfs_da_btree.c | 15 +++++---------- > fs/xfs/xfs_dir2_block.c | 6 +++--- > fs/xfs/xfs_filestream.c | 10 ++-------- > fs/xfs/xfs_iget.c | 3 --- > fs/xfs/xfs_inode.c | 4 ---- > fs/xfs/xfs_inode_item.c | 8 ++------ > fs/xfs/xfs_log.c | 2 -- > fs/xfs/xfs_quota.h | 14 ++++++++++---- > fs/xfs/xfs_trans.c | 1 + > 12 files changed, 33 insertions(+), 47 deletions(-) > > Index: linux-2.6.35-rc2-gcc/fs/xfs/linux-2.6/xfs_sync.c > =================================================================== > --- linux-2.6.35-rc2-gcc.orig/fs/xfs/linux-2.6/xfs_sync.c > +++ linux-2.6.35-rc2-gcc/fs/xfs/linux-2.6/xfs_sync.c > @@ -554,6 +554,9 @@ xfs_sync_worker( > xfs_log_force(mp, 0); > xfs_reclaim_inodes(mp, 0); > /* dgc: errors ignored here */ > + /* ak: yes and you'll get a warning for it now when you > + * upgrade compilers. > + */ > error = xfs_qm_sync(mp, SYNC_TRYLOCK); > if (xfs_log_need_covered(mp)) > error = xfs_commit_dummy_trans(mp, 0); I don't think the coment is necessary - the compiler will remind us that we are ignoring errors. FWIW, we've now got a situation where external static code checkers will tell us that we are not handling an error case (which is where this code and comment came from), and now the compiler will warn us we are assigning but not using the return value. It's a bit of a Catch-22 situation. Hence my question is this - how are we supposed to "safely" ignore a return value seeing as the compiler is now making the current method rather noisy? > Index: linux-2.6.35-rc2-gcc/fs/xfs/xfs_da_btree.c > =================================================================== > --- linux-2.6.35-rc2-gcc.orig/fs/xfs/xfs_da_btree.c > +++ linux-2.6.35-rc2-gcc/fs/xfs/xfs_da_btree.c > @@ -581,10 +581,8 @@ xfs_da_node_add(xfs_da_state_t *state, x > xfs_da_intnode_t *node; > xfs_da_node_entry_t *btree; > int tmp; > - xfs_mount_t *mp; > > node = oldblk->bp->data; > - mp = state->mp; > ASSERT(be16_to_cpu(node->hdr.info.magic) == XFS_DA_NODE_MAGIC); > ASSERT((oldblk->index >= 0) && (oldblk->index <= be16_to_cpu(node->hdr.count))); > ASSERT(newblk->blkno != 0); That'll break a CONFIG_XFS_DEBUG build as the next statement: if (state->args->whichfork == XFS_DATA_FORK) ASSERT(newblk->blkno >= mp->m_dirleafblk && newblk->blkno < mp->m_dirfreeblk); uses mp inside ASSERT statements. > Index: linux-2.6.35-rc2-gcc/fs/xfs/xfs_dir2_block.c > =================================================================== > --- linux-2.6.35-rc2-gcc.orig/fs/xfs/xfs_dir2_block.c > +++ linux-2.6.35-rc2-gcc/fs/xfs/xfs_dir2_block.c > @@ -1073,10 +1073,10 @@ xfs_dir2_sf_to_block( > */ > > buf_len = dp->i_df.if_bytes; > - buf = kmem_alloc(dp->i_df.if_bytes, KM_SLEEP); > + buf = kmem_alloc(buf_len, KM_SLEEP); > > - memcpy(buf, sfp, dp->i_df.if_bytes); > - xfs_idata_realloc(dp, -dp->i_df.if_bytes, XFS_DATA_FORK); > + memcpy(buf, sfp, buf_len); > + xfs_idata_realloc(dp, -buf_len, XFS_DATA_FORK); > dp->i_d.di_size = 0; > xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); > /* Just remove the buf_len variable in this case. > Index: linux-2.6.35-rc2-gcc/fs/xfs/xfs_filestream.c > =================================================================== > --- linux-2.6.35-rc2-gcc.orig/fs/xfs/xfs_filestream.c > +++ linux-2.6.35-rc2-gcc/fs/xfs/xfs_filestream.c > @@ -140,9 +140,8 @@ _xfs_filestream_pick_ag( > int flags, > xfs_extlen_t minlen) > { > - int streams, max_streams; > int err, trylock, nscan; > - xfs_extlen_t longest, free, minfree, maxfree = 0; > + xfs_extlen_t longest, minfree, maxfree = 0; > xfs_agnumber_t ag, max_ag = NULLAGNUMBER; > struct xfs_perag *pag; > > @@ -174,7 +173,6 @@ _xfs_filestream_pick_ag( > /* Keep track of the AG with the most free blocks. */ > if (pag->pagf_freeblks > maxfree) { > maxfree = pag->pagf_freeblks; > - max_streams = atomic_read(&pag->pagf_fstrms); > max_ag = ag; > } > > @@ -196,8 +194,6 @@ _xfs_filestream_pick_ag( > (flags & XFS_PICK_LOWSPACE))) { > > /* Break out, retaining the reference on the AG. */ > - free = pag->pagf_freeblks; > - streams = atomic_read(&pag->pagf_fstrms); > xfs_perag_put(pag); > *agp = ag; > break; > @@ -234,8 +230,6 @@ next_ag: > if (max_ag != NULLAGNUMBER) { > xfs_filestream_get_ag(mp, max_ag); > TRACE_AG_PICK1(mp, max_ag, maxfree); > - streams = max_streams; > - free = maxfree; > *agp = max_ag; > break; > } > @@ -364,7 +358,7 @@ xfs_fstrm_free_func( > /* Drop the reference taken on the AG when the item was added. */ > ref = xfs_filestream_put_ag(ip->i_mount, item->ag); > > - ASSERT(ref >= 0); > + QASSERT(ref >= 0); > TRACE_FREE(ip->i_mount, ip, item->pip, item->ag, > xfs_filestream_peek_ag(ip->i_mount, item->ag)); These are all "unused" because they are used in debug code only. i.e. in XFS_FILESTREAMS_TRACE configs. This is manual debug code that needs to be converted to the trace infrastructure - the compiler may say it is unused, but it is not dead code, so shoul dnot be removed. See also my comment about QASSERT() above. > #define xfs_trans_unreserve_quota_nblks(tp, ip, nblks, ninos, flags) \ > Index: linux-2.6.35-rc2-gcc/fs/xfs/xfs_trans.c > =================================================================== > --- linux-2.6.35-rc2-gcc.orig/fs/xfs/xfs_trans.c > +++ linux-2.6.35-rc2-gcc/fs/xfs/xfs_trans.c > @@ -1120,6 +1120,7 @@ xfs_trans_unreserve_and_mod_sb( > error = xfs_mod_incore_sb_batch(tp->t_mountp, msb, > (uint)(msbp - msb), rsvd); > ASSERT(error == 0); > + /* FIXME: need real error handling here, error can be ENOSPC */ That comment is wrong and hence is not needed. By design, we should never, ever get an error here because we've already reserved all the space we need and this is just an accounting call. That's what the ASSERT(error == 0) is documenting. It's ben placed there to catch any re-occurrence of the race condition that is documented in the function head comment during development. Anyway, if we do get an error here, we cannot handle it anyway - it's too late to do anything short of a complete shutdown as we've already written the transaction to the log. Cheers, Dave. -- Dave Chinner david@fromorbit.com From tao.ma@oracle.com Mon Jun 14 00:52:47 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5E5qkbd024888 for ; Mon, 14 Jun 2010 00:52:47 -0500 X-ASG-Debug-ID: 1276495128-17cf025b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from rcsinet10.oracle.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id AB5F312AC3BE for ; Sun, 13 Jun 2010 22:58:48 -0700 (PDT) Received: from rcsinet10.oracle.com (rcsinet10.oracle.com [148.87.113.121]) by cuda.sgi.com with ESMTP id sP4zlytfvxkNo9Wn for ; Sun, 13 Jun 2010 22:58:48 -0700 (PDT) Received: from rcsinet13.oracle.com (rcsinet13.oracle.com [148.87.113.125]) by rcsinet10.oracle.com (Switch-3.4.2/Switch-3.4.1) with ESMTP id o5E5t3sd030395 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 14 Jun 2010 05:55:04 GMT Received: from acsmt354.oracle.com (acsmt354.oracle.com [141.146.40.154]) by rcsinet13.oracle.com (Switch-3.4.2/Switch-3.4.1) with ESMTP id o5E5t1uj017647; Mon, 14 Jun 2010 05:55:01 GMT Received: from abhmt005.oracle.com by acsmt355.oracle.com with ESMTP id 342899651276494798; Sun, 13 Jun 2010 22:53:18 -0700 Received: from [192.168.1.2] (/114.245.231.90) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Sun, 13 Jun 2010 22:53:17 -0700 Message-ID: <4C15C3C7.5090706@oracle.com> Date: Mon, 14 Jun 2010 13:53:11 +0800 From: Tao Ma User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com, linux-kernel@vger.kernel.org, sandeen@sandeen.net, Alex Elder , Christoph Hellwig , "tao.ma" X-ASG-Orig-Subj: Re: [PATCH v2] xfs: Make fiemap works with sparse file. Subject: Re: [PATCH v2] xfs: Make fiemap works with sparse file. References: <1276308495-14267-1-git-send-email-tao.ma@oracle.com> <20100614002705.GA6590@dastard> In-Reply-To: <20100614002705.GA6590@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Auth-Type: Internal IP X-Source-IP: rcsinet13.oracle.com [148.87.113.125] X-CT-RefId: str=0001.0A090206.4C15C439.006A:SCFMA4539811,ss=1,fgs=0 X-Barracuda-Connect: rcsinet10.oracle.com[148.87.113.121] X-Barracuda-Start-Time: 1276495128 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32488 Rule breakdown below pts rule 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 06/14/2010 08:27 AM, Dave Chinner wrote: > On Sat, Jun 12, 2010 at 10:08:15AM +0800, Tao Ma wrote: >> In xfs_vn_fiemap, we set bvm_count to fi_extent_max + 1 and want >> to return fi_extent_max extents, but actually it won't work for >> a sparse file. > > Define "won't work". i.e. what's the test case? I just created a > sparse file and checked it, and it reported all the extents in it: > > # xfs_bmap -vp testfile > testfile: > EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL FLAGS > 0: [0..7]: hole 8 > 1: [8..15]: 96..103 0 (96..103) 8 00000 > 2: [16..23]: hole 8 > 3: [24..31]: 112..119 0 (112..119) 8 00000 > 4: [32..39]: hole 8 > 5: [40..47]: 128..135 0 (128..135) 8 00000 > 6: [48..55]: hole 8 > 7: [56..63]: 144..151 0 (144..151) 8 00000 > 8: [64..71]: hole 8 > 9: [72..79]: 160..167 0 (160..167) 8 00000 > 10: [80..87]: hole 8 > 11: [88..95]: 176..183 0 (176..183) 8 00000 > 12: [96..103]: hole 8 > 13: [104..111]: 192..199 0 (192..199) 8 00000 > 14: [112..119]: hole 8 > 15: [120..127]: 208..215 0 (208..215) 8 00000 ok, so let me explain it. In commit 2d1ff3c75a4642062d314634290be6d8da4ffb03, I add the mode for extent query of fiemap for xfs. So with your test file, it will return that we have 8 extents(because in xfs_fiemap_format we don't return holes). So normally and naturally, a user begin to iterate all the extents by doing fiemap = malloc(sizeof(fiemap) + 8 * sizeof(struct fiemap_extent)); fiemap->fm_extent_count = 8 But what will happen? He will only get 4 extent. So do you think it is acceptable for a user? We told him that we have 8 extents, he has allocated enough space, but he can't get what he wanted. And he need to fiemap = malloc(sizeof(fiemap) + 16 * sizeof(struct fiemap_extent)); fiemap->fm_extent_count = 16 to get 8 extent for your test file. > # filefrag -v testfile > Filesystem type is: 58465342 > File size of testfile is 65536 (16 blocks, blocksize 4096) > ext logical physical expected length flags > 0 1 12 1 > 1 3 14 12 1 > 2 5 16 14 1 > 3 7 18 16 1 > 4 9 20 18 1 > 5 11 22 20 1 > 6 13 24 22 1 > 7 15 26 24 1 eof > testfile: 9 extents found > # > > FWIW, filefrag seems busted - the file has 8 extents, not 9. yeah, filefrag is really broken. > >> The reason is that in xfs_getbmap we will >> calculate holes and set it in 'out', while out is malloced by >> bmv_count(fi_extent_max+1) which didn't consider holes. So in the >> worst case, if 'out' vector looks like >> [hole, extent, hole, extent, hole, ... hole, extent, hole], >> we will only return half of fi_extent_max extents. > > Right, it's not broken, we simply return less than fi_extent_mex > extents when there are holes. I don't see that as a problem as > applications have to handle that case anyway, and.... see my above test case. I guess we really don't want a userspace user to allocate num_extents * 2 + 1 fiemap_extent to get them. > >> So in xfs_vn_fiemap, we should consider this worst case. If the >> user wants fi_extent_max extents, we need a 'out' with size of >> 2 *fi_extent_max + 2(one more the header). > > That's rather dangerous, I think. It relies on other code to catch > the buffer overrun that this sets up for fragmented, non-sparse > files. Personally I'd much prefer to return fewer extents for sparse > files than to add a landmine like this into the kernel code.... We just change the size of our 'out', we don't change fi_extent_max or anything related to the fiemap. So I think what we care is how to keep our 'out' in good shape and fiemap should handle and check their fi_extent_max if we pass it more extents. btw, maybe there is a better solution for the problem I described above. If there is a good one, I am happy to accept it. Regards, Tao From andi@firstfloor.org Mon Jun 14 02:40:40 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5E7ed9D031411 for ; Mon, 14 Jun 2010 02:40:40 -0500 X-ASG-Debug-ID: 1276501392-30ec02a90000-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 613EE1BDA53D for ; Mon, 14 Jun 2010 00:43:12 -0700 (PDT) Received: from one.firstfloor.org (one.firstfloor.org [213.235.205.2]) by cuda.sgi.com with ESMTP id uiBlvHvBjLfseO4n for ; Mon, 14 Jun 2010 00:43:12 -0700 (PDT) Received: from basil.firstfloor.org (p5B3CB7D3.dip0.t-ipconnect.de [91.60.183.211]) by one.firstfloor.org (Postfix) with ESMTP id 7AE4C1A980C3; Mon, 14 Jun 2010 09:43:10 +0200 (CEST) Received: by basil.firstfloor.org (Postfix, from userid 1000) id 9A8D3B1A32; Mon, 14 Jun 2010 09:43:09 +0200 (CEST) Date: Mon, 14 Jun 2010 09:43:09 +0200 From: Andi Kleen To: Dave Chinner Cc: Andi Kleen , xfs@oss.sgi.com, akpm@linux-foundation.org, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: Re: [PATCH] [16/23] XFS: Fix gcc 4.6 set but not read and unused statement warnings Subject: Re: [PATCH] [16/23] XFS: Fix gcc 4.6 set but not read and unused statement warnings Message-ID: <20100614074309.GA17092@basil.fritz.box> References: <20100610110.764742110@firstfloor.org> <20100610111052.3DDC5B1A2B@basil.firstfloor.org> <20100614042700.GC6590@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100614042700.GC6590@dastard> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: one.firstfloor.org[213.235.205.2] X-Barracuda-Start-Time: 1276501393 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32495 Rule breakdown below pts rule 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, Jun 14, 2010 at 02:27:00PM +1000, Dave Chinner wrote: > > Unused statements were mostly related to stub macros for disabled > > features like QUOTA or RT ALLOC. I replace those with > > inlines. > > Did you compile with/without XFS_DEBUG (I don't think so)? when No. I merely made my own config work with relatively little warnings. > changing code that affects ASSERT statements, CONFIG_XFS_DEBUG needs to > be selected to test that this code compiles. Most XFs developers > build with XFS_CONFIG_DEBUG for everything other than performance > testing, so ensuring this builds is definitely required. ;) Ok fair enough. > > I'd also be interested if any fixes are needed with all options > enabled. Seems silly just to fix a few warnings in just one > particular configuration rather than all of them... There are tons more warnings with allyesconfig I'm sure, not only in xfs. They will need time to work out. This will happen over time as people eventually move to gcc 4.6 (after it's released) Some of the warnings are also related to not enabling everything (e.g. no quota) > > > There were also some problems with variables use