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 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: I originally planned to use it for more, but then ended up changing other code in other ways. I still don't think it's a ugly hack, it's a relatively simple way to handle this. But I can change this single occurrence. > 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? Fix the problem? Otherwise you can use a (void) cast, but that's a bad way if there's a real problem. > > dp->i_d.di_size = 0; > > xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); > > /* > > Just remove the buf_len variable in this case. I think the code looks cleaner when using buf_len > 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 I have no plans to do that. > say it is unused, but it is not dead code, so shoul dnot be removed. I did not remove anything. > > (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 Ok. But I must say ASSERT() is not really a good way to document things like that. Whoever wrote this gets what he deserves now ... > 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. Well I guess it should be unconditional BUG_ON then. -Andi -- ak@linux.intel.com -- Speaking for myself only. From andi@firstfloor.org Mon Jun 14 03:11: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.4 required=5.0 tests=BAYES_00,J_CHICKENPOX_25, J_CHICKENPOX_62,J_CHICKENPOX_63,J_CHICKENPOX_64,J_CHICKENPOX_65, LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5E8BRxo032490 for ; Mon, 14 Jun 2010 03:11:27 -0500 X-ASG-Debug-ID: 1276503237-6c4103530000-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 539453C424C for ; Mon, 14 Jun 2010 01:13:58 -0700 (PDT) Received: from one.firstfloor.org (one.firstfloor.org [213.235.205.2]) by cuda.sgi.com with ESMTP id rzYOFrlyCFtl9QKt for ; Mon, 14 Jun 2010 01:13:58 -0700 (PDT) Received: from basil.firstfloor.org (p5B3CB7D3.dip0.t-ipconnect.de [91.60.183.211]) by one.firstfloor.org (Postfix) with ESMTP id 58C1D1A980C3; Mon, 14 Jun 2010 10:13:57 +0200 (CEST) Received: by basil.firstfloor.org (Postfix, from userid 1000) id D9409B1A32; Mon, 14 Jun 2010 10:13:56 +0200 (CEST) Date: Mon, 14 Jun 2010 10:13:56 +0200 From: Andi Kleen To: xfs@oss.sgi.com, ak@linux.intel.com, dgc@fromorbit.com, hch@lst.de X-ASG-Orig-Subj: [PATCH] XFS: Fix gcc 4.6 set but not read and unused statement warnings v2 Subject: [PATCH] XFS: Fix gcc 4.6 set but not read and unused statement warnings v2 Message-ID: <20100614081356.GA27499@basil.fritz.box> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: one.firstfloor.org[213.235.205.2] X-Barracuda-Start-Time: 1276503239 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32497 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean XFS: Fix gcc 4.6 set but not read and unused statement warnings v2 Addresses (near) all outstanding comments: v2: QASSERT removed. Dave Chinners comments addressed (well the one I liked). CONFIG_XFS_DEBUG builds again now. I checked RT+QUOTA enabled and there was no new warnings (if someone is interested i put the remaining ones at http://halobates.de/xfs-all-gcc46) -Andi --- 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. v2: QASSERT removed. Dave Chinners comments addressed (well the one I liked). CONFIG_XFS_DEBUG builds again now. I checked RT+QUOTA enabled and there was no new warnings (if someone is interested i put the remaining ones at http://halobates.de/xfs-all-gcc46) Cc: xfs@oss.sgi.com Signed-off-by: Andi Kleen --- fs/xfs/linux-2.6/xfs_sync.c | 3 +++ fs/xfs/xfs_alloc.c | 10 +++------- fs/xfs/xfs_da_btree.c | 19 +++++++------------ fs/xfs/xfs_dir2_block.c | 6 +++--- fs/xfs/xfs_filestream.c | 16 +++++----------- 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 | 6 +++++- 11 files changed, 38 insertions(+), 53 deletions(-) Index: linux-2.6.35-rc3-gcc/fs/xfs/linux-2.6/xfs_sync.c =================================================================== --- linux-2.6.35-rc3-gcc.orig/fs/xfs/linux-2.6/xfs_sync.c +++ linux-2.6.35-rc3-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-rc3-gcc/fs/xfs/xfs_da_btree.c =================================================================== --- linux-2.6.35-rc3-gcc.orig/fs/xfs/xfs_da_btree.c +++ linux-2.6.35-rc3-gcc/fs/xfs/xfs_da_btree.c @@ -581,16 +581,14 @@ 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); if (state->args->whichfork == XFS_DATA_FORK) - ASSERT(newblk->blkno >= mp->m_dirleafblk && - newblk->blkno < mp->m_dirfreeblk); + ASSERT(newblk->blkno >= state->mp->m_dirleafblk && + newblk->blkno < state->mp->m_dirfreeblk); /* * We may need to make some room before we insert the new node. @@ -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-rc3-gcc/fs/xfs/xfs_dir2_block.c =================================================================== --- linux-2.6.35-rc3-gcc.orig/fs/xfs/xfs_dir2_block.c +++ linux-2.6.35-rc3-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-rc3-gcc/fs/xfs/xfs_filestream.c =================================================================== --- linux-2.6.35-rc3-gcc.orig/fs/xfs/xfs_filestream.c +++ linux-2.6.35-rc3-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,8 @@ 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); + if (ref < 0) + ASSERT(0); TRACE_FREE(ip->i_mount, ip, item->pip, item->ag, xfs_filestream_peek_ag(ip->i_mount, item->ag)); @@ -465,7 +460,6 @@ xfs_filestream_lookup_ag( xfs_mru_cache_t *cache; fstrm_item_t *item; xfs_agnumber_t ag; - int ref; if (!(ip->i_d.di_mode & (S_IFREG | S_IFDIR))) { ASSERT(0); @@ -481,10 +475,10 @@ xfs_filestream_lookup_ag( ASSERT(ip == item->ip); ag = item->ag; - ref = xfs_filestream_peek_ag(ip->i_mount, ag); xfs_mru_cache_done(cache); - TRACE_LOOKUP(ip->i_mount, ip, item->pip, ag, ref); + TRACE_LOOKUP(ip->i_mount, ip, item->pip, ag, + xfs_filestream_peek_ag(ip->i_mount, ag)); return ag; } Index: linux-2.6.35-rc3-gcc/fs/xfs/xfs_iget.c =================================================================== --- linux-2.6.35-rc3-gcc.orig/fs/xfs/xfs_iget.c +++ linux-2.6.35-rc3-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-rc3-gcc/fs/xfs/xfs_inode.c =================================================================== --- linux-2.6.35-rc3-gcc.orig/fs/xfs/xfs_inode.c +++ linux-2.6.35-rc3-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-rc3-gcc/fs/xfs/xfs_inode_item.c =================================================================== --- linux-2.6.35-rc3-gcc.orig/fs/xfs/xfs_inode_item.c +++ linux-2.6.35-rc3-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-rc3-gcc/fs/xfs/xfs_log.c =================================================================== --- linux-2.6.35-rc3-gcc.orig/fs/xfs/xfs_log.c +++ linux-2.6.35-rc3-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-rc3-gcc/fs/xfs/xfs_quota.h =================================================================== --- linux-2.6.35-rc3-gcc.orig/fs/xfs/xfs_quota.h +++ linux-2.6.35-rc3-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-rc3-gcc/fs/xfs/xfs_trans.c =================================================================== --- linux-2.6.35-rc3-gcc.orig/fs/xfs/xfs_trans.c +++ linux-2.6.35-rc3-gcc/fs/xfs/xfs_trans.c @@ -1119,7 +1119,11 @@ xfs_trans_unreserve_and_mod_sb( if (msbp > msb) { error = xfs_mod_incore_sb_batch(tp->t_mountp, msb, (uint)(msbp - msb), rsvd); - ASSERT(error == 0); + /* + * When an error happens here it's a race that's supposed + * to be fixed. Check for this unconditionally. + */ + BUG_ON(error != 0); } } Index: linux-2.6.35-rc3-gcc/fs/xfs/xfs_alloc.c =================================================================== --- linux-2.6.35-rc3-gcc.orig/fs/xfs/xfs_alloc.c +++ linux-2.6.35-rc3-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, From hch@lst.de Mon Jun 14 03:28: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.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_62, J_CHICKENPOX_63 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5E8SGPS033059 for ; Mon, 14 Jun 2010 03:28:16 -0500 X-ASG-Debug-ID: 1276504457-5bed02510000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from verein.lst.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3315812ACB43 for ; Mon, 14 Jun 2010 01:34:17 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id Et8tRsYDRzhVxNgt for ; Mon, 14 Jun 2010 01:34:17 -0700 (PDT) X-ASG-Whitelist: Client Received: from verein.lst.de (localhost [127.0.0.1]) by verein.lst.de (8.12.3/8.12.3/Debian-7.1) with ESMTP id o5E8UMXt029879 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 14 Jun 2010 10:30:22 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-7.2) id o5E8ULcP029876; Mon, 14 Jun 2010 10:30:21 +0200 Date: Mon, 14 Jun 2010 10:30:21 +0200 From: Christoph Hellwig To: Andi Kleen Cc: xfs@oss.sgi.com, ak@linux.intel.com, dgc@fromorbit.com, hch@lst.de X-ASG-Orig-Subj: Re: [PATCH] XFS: Fix gcc 4.6 set but not read and unused statement warnings v2 Subject: Re: [PATCH] XFS: Fix gcc 4.6 set but not read and unused statement warnings v2 Message-ID: <20100614083021.GA29354@lst.de> References: <20100614081356.GA27499@basil.fritz.box> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100614081356.GA27499@basil.fritz.box> User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-Barracuda-Connect: verein.lst.de[213.95.11.210] X-Barracuda-Start-Time: 1276504458 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Jun 14, 2010 at 10:13:56AM +0200, Andi Kleen wrote: > - /* 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); How can this work? bp->data is a void pointer. > @@ -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); These are used by the tracing code not yet converted to the new tracing infrastructure. I think I'll prefer to just add the new tracing code ASAP to make the warnings go away. > break; > } > @@ -364,7 +358,8 @@ 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); > + if (ref < 0) > + ASSERT(0); We never use the return value of xfs_filestream_put_ag, so we an just make it return void (and move it to xfs_filestreams.c while at it). From ak@linux.intel.com Mon Jun 14 03:57: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_62 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5E8vEBE033923 for ; Mon, 14 Jun 2010 03:57:14 -0500 X-ASG-Debug-ID: 1276506196-5bac03320000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mga14.intel.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2979712ACC45 for ; Mon, 14 Jun 2010 02:03:16 -0700 (PDT) Received: from mga14.intel.com (mga14.intel.com [143.182.124.37]) by cuda.sgi.com with ESMTP id 0zJLO5PRmX5ncWVH for ; Mon, 14 Jun 2010 02:03:16 -0700 (PDT) Received: from azsmga001.ch.intel.com ([10.2.17.19]) by azsmga102.ch.intel.com with ESMTP; 14 Jun 2010 01:59:43 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.53,413,1272870000"; d="scan'208";a="288531126" Received: from unknown (HELO [10.254.189.14]) ([10.254.189.14]) by azsmga001.ch.intel.com with ESMTP; 14 Jun 2010 01:59:41 -0700 Message-ID: <4C15EF75.5080909@linux.intel.com> Date: Mon, 14 Jun 2010 10:59:33 +0200 From: Andi Kleen User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: Christoph Hellwig CC: Andi Kleen , xfs@oss.sgi.com, dgc@fromorbit.com X-ASG-Orig-Subj: Re: [PATCH] XFS: Fix gcc 4.6 set but not read and unused statement warnings v2 Subject: Re: [PATCH] XFS: Fix gcc 4.6 set but not read and unused statement warnings v2 References: <20100614081356.GA27499@basil.fritz.box> <20100614083021.GA29354@lst.de> In-Reply-To: <20100614083021.GA29354@lst.de> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mga14.intel.com[143.182.124.37] X-Barracuda-Start-Time: 1276506197 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32500 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean , Christoph Hellwig wrote: > On Mon, Jun 14, 2010 at 10:13:56AM +0200, Andi Kleen wrote: >> - /* 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); > > How can this work? bp->data is a void pointer. It compiled with CONFIG_XFS_DEBUG enabled. Do I need to set some other option to test this? Anyways I don't plan to do any more heavy lifting on this patch, so if you need any other complicated changes someone else will have to do it. -Andi From BATV+91b7c6bff8418a4eb2d7+2486+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 14 04:14:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_33, J_CHICKENPOX_41,J_CHICKENPOX_62 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 o5E9EvvN034556 for ; Mon, 14 Jun 2010 04:14:58 -0500 X-ASG-Debug-ID: 1276507052-0be6020f0000-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 301741BDA9A7 for ; Mon, 14 Jun 2010 02:17:33 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id oB8Gm2SMwsxkzxyL for ; Mon, 14 Jun 2010 02:17:33 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OO5nP-0005op-89; Mon, 14 Jun 2010 09:17:31 +0000 Date: Mon, 14 Jun 2010 05:17:31 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: npiggin@suse.de, viro@zeniv.linux.org.uk X-ASG-Orig-Subj: [PATCH] xfs: new truncate sequence Subject: [PATCH] xfs: new truncate sequence Message-ID: <20100614091731.GA22088@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: 1276507053 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Convert XFS to the new truncate sequence. We still can have errors after updating the file size in xfs_setattr, but these are real I/O errors and lead to a transaction abort and filesystem shutdown, so they are not an issue. Errors from ->write_begin and write_end can now be handled correctly because we can actually get rid of the delalloc extents while previous the buffer state was stipped in block_invalidatepage. There is still no error handling for ->direct_IO, because doing so will need some major restructuring given that we only have the iolock shared and do not hold i_mutex at all. Fortunately leaving the normally allocated blocks behind there is not a major issue and this will get cleaned up by xfs_free_eofblock later. Note: the patch is against Al's vfs.git tree as that contains the nessecary preparations. I'd prefer to get it applied there so that we can get some testing in linux-next. Signed-off-by: Christoph Hellwig Index: linux-2.6/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-06-11 18:20:44.758254642 +0200 +++ linux-2.6/fs/xfs/linux-2.6/xfs_aops.c 2010-06-11 19:33:40.285005724 +0200 @@ -1674,6 +1674,22 @@ xfs_vm_direct_IO( return ret; } +STATIC void +xfs_vm_write_failed( + struct address_space *mapping, + loff_t to) +{ + struct inode *inode = mapping->host; + + if (to > inode->i_size) { + struct iattr ia = { + .ia_valid = ATTR_SIZE | ATTR_FORCE, + .ia_size = inode->i_size, + }; + xfs_setattr(XFS_I(inode), &ia, XFS_ATTR_NOLOCK); + } +} + STATIC int xfs_vm_write_begin( struct file *file, @@ -1688,12 +1704,26 @@ xfs_vm_write_begin( ret = block_write_begin(mapping, pos, len, flags, pagep, xfs_get_blocks); - if (unlikely(ret)) { - loff_t isize = mapping->host->i_size; - if (pos + len > isize) - vmtruncate(mapping->host, isize); - } + if (unlikely(ret)) + xfs_vm_write_failed(mapping, pos + len); + return ret; +} + +STATIC int +xfs_vm_write_end( + struct file *file, + struct address_space *mapping, + loff_t pos, + unsigned len, + unsigned copied, + struct page *page, + void *fsdata) +{ + int ret; + ret = generic_write_end(file, mapping, pos, len, copied, page, fsdata); + if (unlikely(ret < len)) + xfs_vm_write_failed(mapping, pos + len); return ret; } @@ -1739,7 +1769,7 @@ const struct address_space_operations xf .releasepage = xfs_vm_releasepage, .invalidatepage = xfs_vm_invalidatepage, .write_begin = xfs_vm_write_begin, - .write_end = generic_write_end, + .write_end = xfs_vm_write_end, .bmap = xfs_vm_bmap, .direct_IO = xfs_vm_direct_IO, .migratepage = buffer_migrate_page, Index: linux-2.6/fs/xfs/linux-2.6/xfs_iops.c =================================================================== --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_iops.c 2010-06-10 19:52:20.400004327 +0200 +++ linux-2.6/fs/xfs/linux-2.6/xfs_iops.c 2010-06-11 18:20:50.554011870 +0200 @@ -548,21 +548,6 @@ xfs_vn_setattr( return -xfs_setattr(XFS_I(dentry->d_inode), iattr, 0); } -/* - * block_truncate_page can return an error, but we can't propagate it - * at all here. Leave a complaint + stack trace in the syslog because - * this could be bad. If it is bad, we need to propagate the error further. - */ -STATIC void -xfs_vn_truncate( - struct inode *inode) -{ - int error; - error = block_truncate_page(inode->i_mapping, inode->i_size, - xfs_get_blocks); - WARN_ON(error); -} - STATIC long xfs_vn_fallocate( struct inode *inode, @@ -702,7 +687,6 @@ xfs_vn_fiemap( static const struct inode_operations xfs_inode_operations = { .check_acl = xfs_check_acl, - .truncate = xfs_vn_truncate, .getattr = xfs_vn_getattr, .setattr = xfs_vn_setattr, .setxattr = generic_setxattr, Index: linux-2.6/fs/xfs/linux-2.6/xfs_linux.h =================================================================== --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_linux.h 2010-06-10 19:52:20.484003629 +0200 +++ linux-2.6/fs/xfs/linux-2.6/xfs_linux.h 2010-06-11 18:20:50.559254502 +0200 @@ -157,8 +157,6 @@ */ #define xfs_sort(a,n,s,fn) sort(a,n,s,fn,NULL) #define xfs_stack_trace() dump_stack() -#define xfs_itruncate_data(ip, off) \ - (-vmtruncate(VFS_I(ip), (off))) /* Move the kernel do_div definition off to one side */ Index: linux-2.6/fs/xfs/xfs_vnodeops.c =================================================================== --- linux-2.6.orig/fs/xfs/xfs_vnodeops.c 2010-06-10 19:52:20.578004327 +0200 +++ linux-2.6/fs/xfs/xfs_vnodeops.c 2010-06-11 18:20:50.564254781 +0200 @@ -236,8 +236,11 @@ xfs_setattr( * transaction to modify the i_size. */ code = xfs_zero_eof(ip, iattr->ia_size, ip->i_size); + if (code) + goto error_return; } xfs_iunlock(ip, XFS_ILOCK_EXCL); + lock_flags &= ~XFS_ILOCK_EXCL; /* * We are going to log the inode size change in this @@ -251,36 +254,35 @@ xfs_setattr( * really care about here and prevents waiting for other data * not within the range we care about here. */ - if (!code && - ip->i_size != ip->i_d.di_size && + if (ip->i_size != ip->i_d.di_size && iattr->ia_size > ip->i_d.di_size) { code = xfs_flush_pages(ip, ip->i_d.di_size, iattr->ia_size, XBF_ASYNC, FI_NONE); + if (code) + goto error_return; } /* wait for all I/O to complete */ xfs_ioend_wait(ip); - if (!code) - code = xfs_itruncate_data(ip, iattr->ia_size); - if (code) { - ASSERT(tp == NULL); - lock_flags &= ~XFS_ILOCK_EXCL; - ASSERT(lock_flags == XFS_IOLOCK_EXCL || !need_iolock); + code = -block_truncate_page(inode->i_mapping, iattr->ia_size, + xfs_get_blocks); + if (code) goto error_return; - } + tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_SIZE); - if ((code = xfs_trans_reserve(tp, 0, - XFS_ITRUNCATE_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, - XFS_ITRUNCATE_LOG_COUNT))) { - xfs_trans_cancel(tp, 0); - if (need_iolock) - xfs_iunlock(ip, XFS_IOLOCK_EXCL); - return code; - } + code = xfs_trans_reserve(tp, 0, XFS_ITRUNCATE_LOG_RES(mp), 0, + XFS_TRANS_PERM_LOG_RES, + XFS_ITRUNCATE_LOG_COUNT); + if (code) + goto error_return; + + truncate_setsize(inode, iattr->ia_size); + commit_flags = XFS_TRANS_RELEASE_LOG_RES; + lock_flags |= XFS_ILOCK_EXCL; + xfs_ilock(ip, XFS_ILOCK_EXCL); xfs_trans_ijoin(tp, ip, lock_flags); From jack@suse.cz Mon Jun 14 05:08: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 (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5EA8LAB036220 for ; Mon, 14 Jun 2010 05:08:21 -0500 X-ASG-Debug-ID: 1276510463-613502590000-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 8BBAF12AD31A for ; Mon, 14 Jun 2010 03:14:23 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id BqOLHgkGuZIkIRZ1 for ; Mon, 14 Jun 2010 03:14:23 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id F173F8D893; Mon, 14 Jun 2010 12:10:54 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 6CA6E2B1BC7; Mon, 14 Jun 2010 12:10:36 +0200 (CEST) Date: Mon, 14 Jun 2010 12:10:36 +0200 From: Jan Kara To: Eric Sandeen Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] quota: don't disable accounting with quotaoff Subject: Re: [PATCH] quota: don't disable accounting with quotaoff Message-ID: <20100614101035.GD3903@quack.suse.cz> References: <4C12B40A.2070405@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C12B40A.2070405@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1276510464 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi, On Fri 11-06-10 17:09:14, Eric Sandeen wrote: > 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. Yes, I think this behavior makes more sence. Applied. Honza > > 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) { > -- Jan Kara SUSE Labs, CR From jack@suse.cz Mon Jun 14 05:46:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5EAk22o037435 for ; Mon, 14 Jun 2010 05:46:02 -0500 X-ASG-Debug-ID: 1276512517-05a101a80000-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 79B6F3C4700 for ; Mon, 14 Jun 2010 03:48:37 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id yCvI3KdZ8R41YWvD for ; Mon, 14 Jun 2010 03:48:37 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id C791A5362F; Mon, 14 Jun 2010 12:48:36 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id EA0B72B1BC7; Mon, 14 Jun 2010 12:48:17 +0200 (CEST) Date: Mon, 14 Jun 2010 12:48:17 +0200 From: Jan Kara To: Eric Sandeen Cc: Jan Kara , 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 Message-ID: <20100614104817.GE3903@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> <20100610105813.GB10827@quack.suse.cz> <4C1117F3.2010008@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C1117F3.2010008@sandeen.net> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1276512518 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 10-06-10 11:50:59, 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... > >> > >> +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. OK, will add that. > > 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*? Yes, because we disabled also accounting. But with your change to quota tools it shouldn't be a problem anymore. Still I've added a test so that we turn quotas off only for ext? and reiserfs so that the tests work with older quota tools as well. > Not sure if that's intended... > > Also is there a reason to disable quota before repquota? Is disable/enable > around quotacheck enough? Yes, that would be 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. I'm seeing some quota miscomputations for ext4, but ext2 and ext3 work fine for me. I didn't have time to look into why ext4 after quotacheck reports different number of blocks. Maybe it's just delayed allocation, maybe it's a real bug. > > 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. OK, I'll add this to the test. Honza -- Jan Kara SUSE Labs, CR From SRS0+Vc/5+14+fromorbit.com=david@internode.on.net Mon Jun 14 07:27:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5ECR5Mh040433 for ; Mon, 14 Jun 2010 07:27:05 -0500 X-ASG-Debug-ID: 1276518579-336e02350000-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 D01161D5A34E for ; Mon, 14 Jun 2010 05:29:39 -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 JQvCH3QY9yOwW0mo for ; Mon, 14 Jun 2010 05:29:39 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27715521-1927428 for multiple; Mon, 14 Jun 2010 21:59:14 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OO8mu-0002Mx-QZ; Mon, 14 Jun 2010 22:29:12 +1000 Date: Mon, 14 Jun 2010 22:29:12 +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: <20100614122912.GD6590@dastard> References: <1276308495-14267-1-git-send-email-tao.ma@oracle.com> <20100614002705.GA6590@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100614002705.GA6590@dastard> 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: 1276518580 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32506 Rule breakdown below pts rule 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 10:27:06AM +1000, Dave Chinner wrote: > On Sat, Jun 12, 2010 at 10:08:15AM +0800, Tao Ma wrote: > > 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.... I just had a thought - if you want to avoid holes being reported to fiemap, then add a BMV_IF_NO_HOLES flag to xfs_getbmap() and skip holes in the mappin gloop when this flag is set. That will make fiemap fill in the full number of extents without hacking the extent count... Cheers, Dave. -- Dave Chinner david@fromorbit.com From jack@suse.cz Mon Jun 14 07:44:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5ECiYEv041033 for ; Mon, 14 Jun 2010 07:44:34 -0500 X-ASG-Debug-ID: 1276519629-29ed03dd0000-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 4D0163C508B for ; Mon, 14 Jun 2010 05:47:09 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id XaOo1R6hExkVbrzT for ; Mon, 14 Jun 2010 05:47:09 -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 A2E275362F; Mon, 14 Jun 2010 14:47:08 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id C1CCC2B1BC7; Mon, 14 Jun 2010 14:46:49 +0200 (CEST) Date: Mon, 14 Jun 2010 14:46:49 +0200 From: Jan Kara To: Eric Sandeen Cc: Jan Kara , 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 Message-ID: <20100614124649.GF3903@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> <20100610105813.GB10827@quack.suse.cz> <4C1117F3.2010008@sandeen.net> <4C114E80.4050803@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C114E80.4050803@sandeen.net> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1276519630 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 10-06-10 15:43:44, Eric Sandeen wrote: > 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 ;) Ah, not many people seem to use quotaon(8) with XFS :). The fact that we turned off both enforcement and accounting was originally intended I think (Nathan Scott wrote the code) but I agree with you that it makes more sence to turn off just enforcement as is stated in the manpage. The check in quotaon.c:newstate() was buggy and worked only by luck for XFS. After I fixed error checking of kern_quota_on the check stopped working... I have now committed changes to quota-tools and checked that quotaon now works reasonably with XFS so it should be cleaned up hopefully. Honza -- Jan Kara SUSE Labs, CR From michael.monnerie@is.it-management.at Mon Jun 14 07:45: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 o5ECjUNC041102 for ; Mon, 14 Jun 2010 07:45:30 -0500 X-ASG-Debug-ID: 1276519891-469702d00000-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 DD15314A1804 for ; Mon, 14 Jun 2010 05:51:31 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id ELA9sBEmqRadjhf8 for ; Mon, 14 Jun 2010 05:51:31 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 0CAF817C for ; Mon, 14 Jun 2010 14:48: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 31DBF83C829 for ; Mon, 14 Jun 2010 14:47:54 +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: Mon, 14 Jun 2010 14:47:57 +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> <4C12E520.6040008@sandeen.net> <201006121533.36684@zmi.at> In-Reply-To: <201006121533.36684@zmi.at> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1746527.Gxl1BZt8Vn"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201006141448.01367@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1276519892 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32507 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart1746527.Gxl1BZt8Vn Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable On Samstag, 12. Juni 2010 Michael Monnerie wrote: > [167981.222861] [] > system_call_fastpath+0x16/0x1b =20 Now it's becoming weird. I had that crash with a directory named /disks/daten/samba/backup/uranus/WindowsImageBackup/uranus/Backup\=20 2010-06-12\ 010016/ /bigbackup/Backup\ 2010-06-05\ 010014/ and the file in there is 852c2690-cf1a-11de-b09b-806e6f6e6963.vhd I moved that broken dir away to /, and did a new rsync. And, guess what,=20 I got the same again: the file inside this dir is broken. The 3rd rsync=20 did not make the same error, it seems good. The problem is that the dump=20 is not the same any more, as that PC made a new image in the meantime.=20 But as I got the same error twice on copy via rsync from one PC to=20 another, it looks like I triggered the error just by copying via "rsync=20 =2DaPvHAXy source destpc::dest/". I did an xfs_metadump and just left the 2 broken dirs inside, so you can=20 easily verify: http://zmi.at/backup-metadump-20100614-broken.bz2 xfs_repair 3.1.2 can't repair that, it crashes. The filesystem is mounted with these options: relatime,logbufs=3D8,logbsize=3D256k,attr2,barrier,largeio,swalloc,allocsiz= e=3D256k =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/ --nextPart1746527.Gxl1BZt8Vn 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) iEYEABECAAYFAkwWJQEACgkQzhSR9xwSCbQ7GgCfTo6JR+xPxUrlhlkqF1tAGIGq PTwAn1deDhFrW8IyRNUuRotKOl1TqmMp =a+aM -----END PGP SIGNATURE----- --nextPart1746527.Gxl1BZt8Vn-- From hch@lst.de Mon Jun 14 07:45:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.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 o5ECjps8041127 for ; Mon, 14 Jun 2010 07:45:52 -0500 X-ASG-Debug-ID: 1276519914-446202d60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from verein.lst.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id AF88B14A180D for ; Mon, 14 Jun 2010 05:51:54 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id qwO3VunGEXkXCFGM for ; Mon, 14 Jun 2010 05:51:54 -0700 (PDT) X-ASG-Whitelist: Client Received: from verein.lst.de (localhost [127.0.0.1]) by verein.lst.de (8.12.3/8.12.3/Debian-7.1) with ESMTP id o5ECm5Xt008576 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 14 Jun 2010 14:48:05 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-7.2) id o5ECm4XF008575; Mon, 14 Jun 2010 14:48:04 +0200 Date: Mon, 14 Jun 2010 14:48:04 +0200 From: Christoph Hellwig To: Andi Kleen Cc: Christoph Hellwig , Andi Kleen , xfs@oss.sgi.com, dgc@fromorbit.com X-ASG-Orig-Subj: Re: [PATCH] XFS: Fix gcc 4.6 set but not read and unused statement warnings v2 Subject: Re: [PATCH] XFS: Fix gcc 4.6 set but not read and unused statement warnings v2 Message-ID: <20100614124804.GA8547@lst.de> References: <20100614081356.GA27499@basil.fritz.box> <20100614083021.GA29354@lst.de> <4C15EF75.5080909@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C15EF75.5080909@linux.intel.com> User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-Barracuda-Connect: verein.lst.de[213.95.11.210] X-Barracuda-Start-Time: 1276519915 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Jun 14, 2010 at 10:59:33AM +0200, Andi Kleen wrote: > >How can this work? bp->data is a void pointer. > > It compiled with CONFIG_XFS_DEBUG enabled. Do I need to set some other > option to test this? It fails for me in a normal CONFIG_XFS_DEBUG build: fs/xfs/xfs_da_btree.c: In function 'xfs_da_root_join': fs/xfs/xfs_da_btree.c:737: warning: dereferencing 'void *' pointer fs/xfs/xfs_da_btree.c:737: error: request for member 'magic' in something not a structure or union fs/xfs/xfs_da_btree.c:737: warning: dereferencing 'void *' pointer ... From tao.ma@oracle.com Mon Jun 14 08:35:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5EDZMa0042655 for ; Mon, 14 Jun 2010 08:35:22 -0500 X-ASG-Debug-ID: 1276522885-3852003c0000-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 0FA88FB1D9F for ; Mon, 14 Jun 2010 06:41:25 -0700 (PDT) Received: from rcsinet10.oracle.com (rcsinet10.oracle.com [148.87.113.121]) by cuda.sgi.com with ESMTP id FmuMDG26zAHCNQx3 for ; Mon, 14 Jun 2010 06:41:25 -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 o5EDbYVL031560 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 14 Jun 2010 13:37:38 GMT Received: from acsmt353.oracle.com (acsmt353.oracle.com [141.146.40.153]) by acsinet15.oracle.com (Switch-3.4.2/Switch-3.4.1) with ESMTP id o5DH2BmH032252; Mon, 14 Jun 2010 13:37:33 GMT Received: from abhmt006.oracle.com by acsmt355.oracle.com with ESMTP id 322915541276522650; Mon, 14 Jun 2010 06:37:30 -0700 Received: from [192.168.1.2] (/114.245.230.98) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 14 Jun 2010 06:37:30 -0700 Message-ID: <4C16308E.1030305@oracle.com> Date: Mon, 14 Jun 2010 21:37:18 +0800 From: Tao Ma Organization: Oracle Corporation User-Agent: Thunderbird 2.0.0.24 (Windows/20100228) MIME-Version: 1.0 To: Dave Chinner 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. References: <1276308495-14267-1-git-send-email-tao.ma@oracle.com> <20100614002705.GA6590@dastard> <20100614122912.GD6590@dastard> In-Reply-To: <20100614122912.GD6590@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Auth-Type: Internal IP X-Source-IP: acsinet15.oracle.com [141.146.126.227] X-CT-RefId: str=0001.0A090202.4C1630A7.00B5:SCFMA922111,ss=1,fgs=0 X-Barracuda-Connect: rcsinet10.oracle.com[148.87.113.121] X-Barracuda-Start-Time: 1276522886 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32511 Rule breakdown below pts rule 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, Dave Chinner wrote: > On Mon, Jun 14, 2010 at 10:27:06AM +1000, Dave Chinner wrote: > >> On Sat, Jun 12, 2010 at 10:08:15AM +0800, Tao Ma wrote: >> >>> 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.... >> > > I just had a thought - if you want to avoid holes being reported to > fiemap, then add a BMV_IF_NO_HOLES flag to xfs_getbmap() and skip > holes in the mappin gloop when this flag is set. That will make > fiemap fill in the full number of extents without hacking the > extent count... > yeah, that should work and I will try to generate a patch for it. I am not quite familiar with xfs, so please be kind to me if I make some stupid mistake in the patch. ;) Regards, Tao From SRS0+Vc/5+14+fromorbit.com=david@internode.on.net Mon Jun 14 08:35: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.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5EDZio5042680 for ; Mon, 14 Jun 2010 08:35:45 -0500 X-ASG-Debug-ID: 1276522905-248901a00000-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 A7F0A12AD390 for ; Mon, 14 Jun 2010 06:41:46 -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 aSh62txITYWYLtC1 for ; Mon, 14 Jun 2010 06:41:46 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27807932-1927428 for multiple; Mon, 14 Jun 2010 23:08:07 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OO9rP-0002Rf-Ta; Mon, 14 Jun 2010 23:37:55 +1000 Date: Mon, 14 Jun 2010 23:37:55 +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: <20100614133755.GE6590@dastard> References: <20100610110.764742110@firstfloor.org> <20100610111052.3DDC5B1A2B@basil.firstfloor.org> <20100614042700.GC6590@dastard> <20100614074309.GA17092@basil.fritz.box> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100614074309.GA17092@basil.fritz.box> 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: 1276522907 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32511 Rule breakdown below pts rule 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 09:43:09AM +0200, Andi Kleen wrote: > On Mon, Jun 14, 2010 at 02:27:00PM +1000, Dave Chinner wrote: > > > 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: > > I originally planned to use it for more, but then ended up > changing other code in other ways. > > I still don't think it's a ugly hack, it's a relatively > simple way to handle this. But I can change this single occurrence. > > > 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? > > Fix the problem? There is no problem. The end of the error reporting line is the main loop of a background kernel thread - anything important is already stashed for later reporting to a real context - so all that is left to do is throw away the error once it propagated to the top of the call chain.... > Otherwise you can use a (void) cast, but that's a bad way > if there's a real problem. Right, and that's exactly my point - we removed all the (void) casts because the error checker flagged them as dangerous. Now the compiler is complaining about not using the error that is returned. So my question still stands.... > > > (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 > > Ok. But I must say ASSERT() is not really a good way to > document things like that. Whoever wrote this gets > what he deserves now ... We have historically documented code assumptions and bounds with ASSERT() calls rather than in comments because it means they are checked at runtime. It means we find out really quickly when we've made some change that has had an unintended side effect, rather than it going unnoticed until some user trips over it. This one in specific has been there for at least 5 years - goes back to before git was used and has proven to be useful for finding at least one subtle race in new code introduced back in 2007 (45c34141126a89da07197d5b89c04c6847f1171a "[XFS] Apply transaction delta counts atomically to incore counters"). FWIW, there's around 2000 asserts in the XFS code - that's about 2% of the code - which means assumptions in the XFS code are pretty well documented compared to other Linux filesystems... > > 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. > > Well I guess it should be unconditional BUG_ON then. Don't be silly. A filesystem shutdown is all that is necessary, especially as the XFS shutdown procedure has hooks to turn corruption events into system panics if the admin wants to configure it that way (generally useful for triggering crash dumps on corruption events for offline triage). Cheers, Dave. -- Dave Chinner david@fromorbit.com From andi@firstfloor.org Mon Jun 14 08:37: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 o5EDbS26042728 for ; Mon, 14 Jun 2010 08:37:28 -0500 X-ASG-Debug-ID: 1276523010-249601c00000-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 500D112AD3BE for ; Mon, 14 Jun 2010 06:43:30 -0700 (PDT) Received: from one.firstfloor.org (one.firstfloor.org [213.235.205.2]) by cuda.sgi.com with ESMTP id F5ph8Kf6jgwwIyWg for ; Mon, 14 Jun 2010 06:43:30 -0700 (PDT) Received: from basil.firstfloor.org (p5B3CB7D3.dip0.t-ipconnect.de [91.60.183.211]) by one.firstfloor.org (Postfix) with ESMTP id 916E11A980C3; Mon, 14 Jun 2010 15:39:59 +0200 (CEST) Received: by basil.firstfloor.org (Postfix, from userid 1000) id F3B4FB1A32; Mon, 14 Jun 2010 15:39:58 +0200 (CEST) Date: Mon, 14 Jun 2010 15:39:58 +0200 From: Andi Kleen To: Christoph Hellwig Cc: Andi Kleen , Andi Kleen , xfs@oss.sgi.com, dgc@fromorbit.com X-ASG-Orig-Subj: Re: [PATCH] XFS: Fix gcc 4.6 set but not read and unused statement warnings v2 Subject: Re: [PATCH] XFS: Fix gcc 4.6 set but not read and unused statement warnings v2 Message-ID: <20100614133958.GH17092@basil.fritz.box> References: <20100614081356.GA27499@basil.fritz.box> <20100614083021.GA29354@lst.de> <4C15EF75.5080909@linux.intel.com> <20100614124804.GA8547@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100614124804.GA8547@lst.de> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: one.firstfloor.org[213.235.205.2] X-Barracuda-Start-Time: 1276523011 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32511 Rule breakdown below pts rule 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:48:04PM +0200, Christoph Hellwig wrote: > On Mon, Jun 14, 2010 at 10:59:33AM +0200, Andi Kleen wrote: > > >How can this work? bp->data is a void pointer. > > > > It compiled with CONFIG_XFS_DEBUG enabled. Do I need to set some other > > option to test this? > > It fails for me in a normal CONFIG_XFS_DEBUG build: > > fs/xfs/xfs_da_btree.c: In function 'xfs_da_root_join': > fs/xfs/xfs_da_btree.c:737: warning: dereferencing 'void *' pointer > fs/xfs/xfs_da_btree.c:737: error: request for member 'magic' in > something not a structure or union > fs/xfs/xfs_da_btree.c:737: warning: dereferencing 'void *' pointer Hmm, it really compiled here (scratching head) % grep XFS .config CONFIG_XFS_FS=m # CONFIG_XFS_QUOTA is not set CONFIG_XFS_POSIX_ACL=y # CONFIG_XFS_RT is not set CONFIG_XFS_DEBUG=y % make CC=gcc46 SUBDIRS=fs/xfs LD fs/xfs/built-in.o CC [M] fs/xfs/linux-2.6/xfs_trace.o CC [M] fs/xfs/linux-2.6/xfs_acl.o CC [M] fs/xfs/linux-2.6/xfs_stats.o CC [M] fs/xfs/linux-2.6/xfs_sysctl.o CC [M] fs/xfs/linux-2.6/xfs_ioctl32.o CC [M] fs/xfs/xfs_alloc.o CC [M] fs/xfs/xfs_alloc_btree.o CC [M] fs/xfs/xfs_attr.o CC [M] fs/xfs/xfs_attr_leaf.o CC [M] fs/xfs/xfs_bit.o CC [M] fs/xfs/xfs_bmap.o CC [M] fs/xfs/xfs_bmap_btree.o CC [M] fs/xfs/xfs_btree.o CC [M] fs/xfs/xfs_buf_item.o CC [M] fs/xfs/xfs_da_btree.o <--------------------------------- CC [M] fs/xfs/xfs_dir2.o CC [M] fs/xfs/xfs_dir2_block.o fs/xfs/xfs_dir2_block.c: In function 'xfs_dir2_sf_to_block': fs/xfs/xfs_dir2_block.c:1153:26: warning: array subscript is above array bounds [-Warray- bounds] ... Do I need to set some other option? -Andi -- ak@linux.intel.com -- Speaking for myself only. From andi@firstfloor.org Mon Jun 14 09:34:48 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5EEYllF044698 for ; Mon, 14 Jun 2010 09:34:47 -0500 X-ASG-Debug-ID: 1276526242-368102fa0000-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 84BF81D5A757 for ; Mon, 14 Jun 2010 07:37:22 -0700 (PDT) Received: from one.firstfloor.org (one.firstfloor.org [213.235.205.2]) by cuda.sgi.com with ESMTP id rFQ8pr1DiptrEKH0 for ; Mon, 14 Jun 2010 07:37:22 -0700 (PDT) Received: from basil.firstfloor.org (p5B3CB7D3.dip0.t-ipconnect.de [91.60.183.211]) by one.firstfloor.org (Postfix) with ESMTP id D53141A980C3; Mon, 14 Jun 2010 16:37:21 +0200 (CEST) Received: by basil.firstfloor.org (Postfix, from userid 1000) id AF599B1A32; Mon, 14 Jun 2010 16:37:20 +0200 (CEST) Date: Mon, 14 Jun 2010 16:37:20 +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: <20100614143720.GI17092@basil.fritz.box> References: <20100610110.764742110@firstfloor.org> <20100610111052.3DDC5B1A2B@basil.firstfloor.org> <20100614042700.GC6590@dastard> <20100614074309.GA17092@basil.fritz.box> <20100614133755.GE6590@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100614133755.GE6590@dastard> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: one.firstfloor.org[213.235.205.2] X-Barracuda-Start-Time: 1276526243 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0338 1.0000 -1.8027 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.80 X-Barracuda-Spam-Status: No, SCORE=-1.80 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32514 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean > > > 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. > > > > Well I guess it should be unconditional BUG_ON then. > > Don't be silly. A filesystem shutdown is all that is necessary, Without BUG_ON it will not end up in kerneloops.org and you will never know about it. That's standard Linux kernel development practice. Maybe XFS should catch up on that. Ok in principle you could make the shutdown a WARN() Anyways I'm out of this. -Andi -- ak@linux.intel.com -- Speaking for myself only. From roman@binarylife.net Mon Jun 14 10:08: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,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 o5EF8mXU045862 for ; Mon, 14 Jun 2010 10:08:49 -0500 X-ASG-Debug-ID: 1276528490-358f03660000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from out1.smtp.messagingengine.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 678FA14A22AB for ; Mon, 14 Jun 2010 08:14:51 -0700 (PDT) Received: from out1.smtp.messagingengine.com (out1.smtp.messagingengine.com [66.111.4.25]) by cuda.sgi.com with ESMTP id 19g9q4BZkhQU8dHI for ; Mon, 14 Jun 2010 08:14:51 -0700 (PDT) Received: from compute2.internal (compute2.internal [10.202.2.42]) by gateway1.messagingengine.com (Postfix) with ESMTP id CA41EF8675; Mon, 14 Jun 2010 11:11:11 -0400 (EDT) Received: from heartbeat2.messagingengine.com ([10.202.2.161]) by compute2.internal (MEProxy); Mon, 14 Jun 2010 11:11:11 -0400 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=messagingengine.com; h=date:from:to:cc:subject:message-id:in-reply-to:references:mime-version:content-type:content-transfer-encoding; s=smtpout; bh=cLk14249P18sJu/JXpYav1vvUaE=; b=LdN5Yk9j0kdmoIQbQUUBnHTK1yQLGPB65B49UqgIYjAeXtHPuWkj98rhNcauDChcnGSXt07DtrczioK5md4K6dskl0mf/vYL4ixiSXj07OfCse+91SIlg0XzZsRG0AmETNqgvIKu7ZlYqQhkxN5R2cCefpqMgPzPYNcBVE72z5c= X-Sasl-enc: 3modDWzv14majjULVAtN4FGqyaVu0v5aXahPo0iPstuf 1276528270 Received: from smola.internal.xtremedata.com (adsl-75-61-228-198.dsl.chcgil.sbcglobal.net [75.61.228.198]) by mail.messagingengine.com (Postfix) with ESMTPSA id D559C454F2; Mon, 14 Jun 2010 11:11:09 -0400 (EDT) Received: from crux.internal.xtremedata.com (crux.internal.xtremedata.com [10.10.0.4]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by smola.internal.xtremedata.com (Postfix) with ESMTPS id 919AE1613C6; Mon, 14 Jun 2010 10:11:08 -0500 (CDT) Received: from abend.internal.xtremedata.com (abend.internal.xtremedata.com [10.10.0.248]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by crux.internal.xtremedata.com (Postfix) with ESMTPS id 3E07C3C20D; Mon, 14 Jun 2010 10:11:08 -0500 (CDT) Date: Mon, 14 Jun 2010 10:11:06 -0500 From: Roman Kononov To: Ilia Mirkin Cc: Dave Chinner , 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: <20100614101106.6d883a2e@abend.internal.xtremedata.com> In-Reply-To: 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> X-Mailer: Claws Mail 3.7.6 (GTK+ 2.20.1; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 8bit X-Barracuda-Connect: out1.smtp.messagingengine.com[66.111.4.25] X-Barracuda-Start-Time: 1276528492 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.32517 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 2010-06-13 23:27 CDT, Ilia Mirkin said: >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. I agree. My reaction to this WARN was horrible: I brought the system down, started fsck-ing and re-installing older kernels, with all kinds of FUD, which took me considerable time. The message was not well explained on the Internet, nor was it clear reading the source code. After talking to the mailing list and investigation of my S/W, I've realized that the system works fine, and the warning now sounds to me as useless and unwanted noise of quite high volume. I am suggesting to issue a notice once per filesytem/mount without taint. The notice could be as such: "WARNING: Userspace issues direct IO which races with buffered or mmap IO on the same file (inode , device ). File data corruption is possible. This message is issued only once per mount". Thanks. From andi@firstfloor.org Mon Jun 14 11:28:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,J_CHICKENPOX_25, J_CHICKENPOX_62,J_CHICKENPOX_63,J_CHICKENPOX_64,J_CHICKENPOX_65, LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5EGSnhW048605 for ; Mon, 14 Jun 2010 11:28:51 -0500 X-ASG-Debug-ID: 1276533083-2e1c029a0000-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 BA5871D5AD96 for ; Mon, 14 Jun 2010 09:31:23 -0700 (PDT) Received: from one.firstfloor.org (one.firstfloor.org [213.235.205.2]) by cuda.sgi.com with ESMTP id x8OlMqLXHLdNVrAE for ; Mon, 14 Jun 2010 09:31:23 -0700 (PDT) Received: from basil.firstfloor.org (p5B3CB7D3.dip0.t-ipconnect.de [91.60.183.211]) by one.firstfloor.org (Postfix) with ESMTP id DCFCA1A980C3; Mon, 14 Jun 2010 18:31:22 +0200 (CEST) Received: by basil.firstfloor.org (Postfix, from userid 1000) id 4BD38B1A32; Mon, 14 Jun 2010 18:31:22 +0200 (CEST) Date: Mon, 14 Jun 2010 18:31:22 +0200 From: Andi Kleen To: Andi Kleen Cc: Christoph Hellwig , Andi Kleen , xfs@oss.sgi.com, dgc@fromorbit.com X-ASG-Orig-Subj: Re: [PATCH] XFS: Fix gcc 4.6 set but not read and unused statement warnings v2 Subject: Re: [PATCH] XFS: Fix gcc 4.6 set but not read and unused statement warnings v2 Message-ID: <20100614163122.GB369@basil.fritz.box> References: <20100614081356.GA27499@basil.fritz.box> <20100614083021.GA29354@lst.de> <4C15EF75.5080909@linux.intel.com> <20100614124804.GA8547@lst.de> <20100614133958.GH17092@basil.fritz.box> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100614133958.GH17092@basil.fritz.box> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: one.firstfloor.org[213.235.205.2] X-Barracuda-Start-Time: 1276533084 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.98 X-Barracuda-Spam-Status: No, SCORE=0.98 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA550, BSF_SC0_SA_TO_FROM_ADDR_MATCH X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32520 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address 2.50 BSF_SC0_SA550 Custom Rule SA550 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 03:39:58PM +0200, Andi Kleen wrote: > On Mon, Jun 14, 2010 at 02:48:04PM +0200, Christoph Hellwig wrote: > > On Mon, Jun 14, 2010 at 10:59:33AM +0200, Andi Kleen wrote: > > > >How can this work? bp->data is a void pointer. > > > > > > It compiled with CONFIG_XFS_DEBUG enabled. Do I need to set some other > > > option to test this? > > > > It fails for me in a normal CONFIG_XFS_DEBUG build: > > > > fs/xfs/xfs_da_btree.c: In function 'xfs_da_root_join': > > fs/xfs/xfs_da_btree.c:737: warning: dereferencing 'void *' pointer > > fs/xfs/xfs_da_btree.c:737: error: request for member 'magic' in > > something not a structure or union > > fs/xfs/xfs_da_btree.c:737: warning: dereferencing 'void *' pointer > > > Hmm, it really compiled here (scratching head) Never mind, it seems SUBDIRS doesn't set the DEBUG flag correctly. Anyways I just dropped those hunks and you'll have to live with the warnings if you don't want QASSERT. Final version -Andi --- XFS: Fix gcc 4.6 set but not read and unused statement warnings v3 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. v2: QASSERT removed. Dave Chinners comments addressed (well the one I liked). CONFIG_XFS_DEBUG builds again now. I checked RT+QUOTA enabled and there was no new warnings (if someone is interested i put the remaining ones at http://halobates.de/xfs-all-gcc46) v3: Finally fix DEBUG build Cc: xfs@oss.sgi.com Signed-off-by: Andi Kleen --- fs/xfs/linux-2.6/xfs_sync.c | 3 +++ fs/xfs/xfs_alloc.c | 10 +++------- fs/xfs/xfs_da_btree.c | 6 ++---- fs/xfs/xfs_dir2_block.c | 6 +++--- fs/xfs/xfs_filestream.c | 16 +++++----------- fs/xfs/xfs_iget.c | 3 --- fs/xfs/xfs_inode.c | 4 ---- fs/xfs/xfs_inode_item.c | 7 ++----- fs/xfs/xfs_log.c | 2 -- fs/xfs/xfs_quota.h | 14 ++++++++++---- fs/xfs/xfs_trans.c | 6 +++++- 11 files changed, 33 insertions(+), 44 deletions(-) Index: linux-2.6.35-rc3-gcc/fs/xfs/linux-2.6/xfs_sync.c =================================================================== --- linux-2.6.35-rc3-gcc.orig/fs/xfs/linux-2.6/xfs_sync.c +++ linux-2.6.35-rc3-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-rc3-gcc/fs/xfs/xfs_da_btree.c =================================================================== --- linux-2.6.35-rc3-gcc.orig/fs/xfs/xfs_da_btree.c +++ linux-2.6.35-rc3-gcc/fs/xfs/xfs_da_btree.c @@ -581,16 +581,14 @@ 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); if (state->args->whichfork == XFS_DATA_FORK) - ASSERT(newblk->blkno >= mp->m_dirleafblk && - newblk->blkno < mp->m_dirfreeblk); + ASSERT(newblk->blkno >= state->mp->m_dirleafblk && + newblk->blkno < state->mp->m_dirfreeblk); /* * We may need to make some room before we insert the new node. Index: linux-2.6.35-rc3-gcc/fs/xfs/xfs_dir2_block.c =================================================================== --- linux-2.6.35-rc3-gcc.orig/fs/xfs/xfs_dir2_block.c +++ linux-2.6.35-rc3-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-rc3-gcc/fs/xfs/xfs_filestream.c =================================================================== --- linux-2.6.35-rc3-gcc.orig/fs/xfs/xfs_filestream.c +++ linux-2.6.35-rc3-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,8 @@ 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); + if (ref < 0) + ASSERT(0); TRACE_FREE(ip->i_mount, ip, item->pip, item->ag, xfs_filestream_peek_ag(ip->i_mount, item->ag)); @@ -465,7 +460,6 @@ xfs_filestream_lookup_ag( xfs_mru_cache_t *cache; fstrm_item_t *item; xfs_agnumber_t ag; - int ref; if (!(ip->i_d.di_mode & (S_IFREG | S_IFDIR))) { ASSERT(0); @@ -481,10 +475,10 @@ xfs_filestream_lookup_ag( ASSERT(ip == item->ip); ag = item->ag; - ref = xfs_filestream_peek_ag(ip->i_mount, ag); xfs_mru_cache_done(cache); - TRACE_LOOKUP(ip->i_mount, ip, item->pip, ag, ref); + TRACE_LOOKUP(ip->i_mount, ip, item->pip, ag, + xfs_filestream_peek_ag(ip->i_mount, ag)); return ag; } Index: linux-2.6.35-rc3-gcc/fs/xfs/xfs_iget.c =================================================================== --- linux-2.6.35-rc3-gcc.orig/fs/xfs/xfs_iget.c +++ linux-2.6.35-rc3-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-rc3-gcc/fs/xfs/xfs_inode.c =================================================================== --- linux-2.6.35-rc3-gcc.orig/fs/xfs/xfs_inode.c +++ linux-2.6.35-rc3-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-rc3-gcc/fs/xfs/xfs_inode_item.c =================================================================== --- linux-2.6.35-rc3-gcc.orig/fs/xfs/xfs_inode_item.c +++ linux-2.6.35-rc3-gcc/fs/xfs/xfs_inode_item.c @@ -323,9 +323,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 +956,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-rc3-gcc/fs/xfs/xfs_log.c =================================================================== --- linux-2.6.35-rc3-gcc.orig/fs/xfs/xfs_log.c +++ linux-2.6.35-rc3-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-rc3-gcc/fs/xfs/xfs_quota.h =================================================================== --- linux-2.6.35-rc3-gcc.orig/fs/xfs/xfs_quota.h +++ linux-2.6.35-rc3-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-rc3-gcc/fs/xfs/xfs_trans.c =================================================================== --- linux-2.6.35-rc3-gcc.orig/fs/xfs/xfs_trans.c +++ linux-2.6.35-rc3-gcc/fs/xfs/xfs_trans.c @@ -1119,7 +1119,11 @@ xfs_trans_unreserve_and_mod_sb( if (msbp > msb) { error = xfs_mod_incore_sb_batch(tp->t_mountp, msb, (uint)(msbp - msb), rsvd); - ASSERT(error == 0); + /* + * When an error happens here it's a race that's supposed + * to be fixed. Check for this unconditionally. + */ + BUG_ON(error != 0); } } Index: linux-2.6.35-rc3-gcc/fs/xfs/xfs_alloc.c =================================================================== --- linux-2.6.35-rc3-gcc.orig/fs/xfs/xfs_alloc.c +++ linux-2.6.35-rc3-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, From SRS0+wWFy+14+fromorbit.com=david@internode.on.net Mon Jun 14 17:22:39 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5EMMcmr059081 for ; Mon, 14 Jun 2010 17:22:39 -0500 X-ASG-Debug-ID: 1276554521-3260014c0000-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 EBE0B12ADAA1 for ; Mon, 14 Jun 2010 15:28:41 -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 1iOBJBqfsx0CqorH for ; Mon, 14 Jun 2010 15:28:41 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27990087-1927428 for multiple; Tue, 15 Jun 2010 07:55:00 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OOI5S-00036O-8G; Tue, 15 Jun 2010 08:24:58 +1000 Date: Tue, 15 Jun 2010 08:24:58 +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: <20100614222458.GF6590@dastard> References: <20100610110.764742110@firstfloor.org> <20100610111052.3DDC5B1A2B@basil.firstfloor.org> <20100614042700.GC6590@dastard> <20100614074309.GA17092@basil.fritz.box> <20100614133755.GE6590@dastard> <20100614143720.GI17092@basil.fritz.box> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100614143720.GI17092@basil.fritz.box> 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: 1276554523 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0020 1.0000 -2.0080 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.32544 Rule breakdown below pts rule 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 04:37:20PM +0200, Andi Kleen wrote: > > > > 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. > > > > > > Well I guess it should be unconditional BUG_ON then. > > > > Don't be silly. A filesystem shutdown is all that is necessary, > > Without BUG_ON it will not end up in kerneloops.org and you will > never know about it. We find out about corrupted filesystems all the time from users sending mail to the list. Even if we did panic by default on corruption events, kerneloops.org is *useless* for reporting them because finding out about a corruption is only the very first step of what is usually a long and involved process that requires user interaction to gather information necessary to find the cause of the corruption. Besides, if we _really_ want the machine to panic on corruption, then we configure the machine specifically for it via setting the relevant corruption type bit in /proc/sys/fs/xfs/panic_mask. This is generally only used when a developer asks a user to set it to get kernel crash dumps triggered when a corruption event occurs so we can do remote, offline analysis of the failure. > That's standard Linux kernel development > practice. Maybe XFS should catch up on that. I find this really amusing because linux filesystems have, over the last few years, implemented a simpler version of XFS's way of dealing with corruption events(*). Perhaps you should catch up with the state of the art before throwing rocks, Andi.... Cheers, Dave. (*) extN, fat, hpfs, jfs, nilfs2, ntfs, ocfs2 and logfs all have configurable corruption event behaviour that default to remount-ro and can be configured to panic the machine. -- Dave Chinner david@fromorbit.com From SRS0+mffZ+15+fromorbit.com=david@internode.on.net Mon Jun 14 19:52:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5F0qBlW064050 for ; Mon, 14 Jun 2010 19:52:11 -0500 X-ASG-Debug-ID: 1276563285-033900be0000-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 9C1693C7872 for ; Mon, 14 Jun 2010 17:54:46 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id ASohuIhutP4RmIlx for ; Mon, 14 Jun 2010 17:54:46 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27908564-1927428 for multiple; Tue, 15 Jun 2010 10:24:44 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OOKQM-0003Gj-B7; Tue, 15 Jun 2010 10:54:42 +1000 Date: Tue, 15 Jun 2010 10:54:42 +1000 From: Dave Chinner To: Andi Kleen Cc: Andi Kleen , Christoph Hellwig , dgc@fromorbit.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] XFS: Fix gcc 4.6 set but not read and unused statement warnings v2 Subject: Re: [PATCH] XFS: Fix gcc 4.6 set but not read and unused statement warnings v2 Message-ID: <20100615005442.GL6590@dastard> References: <20100614081356.GA27499@basil.fritz.box> <20100614083021.GA29354@lst.de> <4C15EF75.5080909@linux.intel.com> <20100614124804.GA8547@lst.de> <20100614133958.GH17092@basil.fritz.box> <20100614163122.GB369@basil.fritz.box> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100614163122.GB369@basil.fritz.box> 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: 1276563287 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32547 Rule breakdown below pts rule 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 06:31:22PM +0200, Andi Kleen wrote: > On Mon, Jun 14, 2010 at 03:39:58PM +0200, Andi Kleen wrote: > > On Mon, Jun 14, 2010 at 02:48:04PM +0200, Christoph Hellwig wrote: > > > On Mon, Jun 14, 2010 at 10:59:33AM +0200, Andi Kleen wrote: > > > > >How can this work? bp->data is a void pointer. > > > > > > > > It compiled with CONFIG_XFS_DEBUG enabled. Do I need to set some other > > > > option to test this? > > > > > > It fails for me in a normal CONFIG_XFS_DEBUG build: > > > > > > fs/xfs/xfs_da_btree.c: In function 'xfs_da_root_join': > > > fs/xfs/xfs_da_btree.c:737: warning: dereferencing 'void *' pointer > > > fs/xfs/xfs_da_btree.c:737: error: request for member 'magic' in > > > something not a structure or union > > > fs/xfs/xfs_da_btree.c:737: warning: dereferencing 'void *' pointer > > > > > > Hmm, it really compiled here (scratching head) > > Never mind, it seems SUBDIRS doesn't set the DEBUG flag correctly. > > Anyways I just dropped those hunks and you'll have to live with > the warnings if you don't want QASSERT. I'm still not happy with it. We'll commit a modified version of one of your patches into the XFS tree as you seem unable to accept that changes might be necessary to get your code to pass review. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0++2Dd+15+fromorbit.com=david@internode.on.net Mon Jun 14 20:18: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 (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5F1Io8O064779 for ; Mon, 14 Jun 2010 20:18:50 -0500 X-ASG-Debug-ID: 1276565094-41d101170000-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 B3C77AE0442 for ; Mon, 14 Jun 2010 18:24:55 -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 x81nzgWzDalodI3a for ; Mon, 14 Jun 2010 18:24:55 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28012329-1927428 for multiple; Tue, 15 Jun 2010 10:51:16 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OOKq3-0003Ij-27; Tue, 15 Jun 2010 11:21:15 +1000 Date: Tue, 15 Jun 2010 11:21:15 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com, Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: fix corruption case for block size < page size Subject: Re: [PATCH 1/3] xfs: fix corruption case for block size < page size Message-ID: <20100615012114.GM6590@dastard> References: <20100611161312.446670249@bombadil.infradead.org> <20100611161510.303551652@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100611161510.303551652@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: 1276565096 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32548 Rule breakdown below pts rule 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:13:13PM -0400, Christoph Hellwig wrote: > 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 Looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+277A+15+fromorbit.com=david@internode.on.net Mon Jun 14 20:35: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 o5F1Z7O8065186 for ; Mon, 14 Jun 2010 20:35:07 -0500 X-ASG-Debug-ID: 1276565860-0e0d01c80000-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 64CB13C7E90 for ; Mon, 14 Jun 2010 18:37:40 -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 kXocAB1z4u7zdS6K for ; Mon, 14 Jun 2010 18:37:40 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27767563-1927428 for multiple; Tue, 15 Jun 2010 11:07:39 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OOL5t-0003Jf-6A; Tue, 15 Jun 2010 11:37:37 +1000 Date: Tue, 15 Jun 2010 11:37:37 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/3] xfs: simplify xfs_vm_releasepage Subject: Re: [PATCH 2/3] xfs: simplify xfs_vm_releasepage Message-ID: <20100615013737.GN6590@dastard> References: <20100611161312.446670249@bombadil.infradead.org> <20100611161511.791495868@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20100611161511.791495868@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: 1276565863 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32549 Rule breakdown below pts rule 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:13:14PM -0400, Christoph Hellwig wrote: > 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 Looks good. Couple of things: > + > + /* > + * 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; > + That's gone in mainline as of as of .35-rc3. We need to get the xfs-dev tree updated. Otherwise, conѕider it: Reviewed-by: Dave Chinner Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+AiuP+15+fromorbit.com=david@internode.on.net Mon Jun 14 20:48:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.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 o5F1mF5x065714 for ; Mon, 14 Jun 2010 20:48:15 -0500 X-ASG-Debug-ID: 1276566860-370d037e0000-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 1732EAE2BC2 for ; Mon, 14 Jun 2010 18:54:20 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id Q88ksHRTcHwv8UTS for ; Mon, 14 Jun 2010 18:54:20 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28194217-1927428 for multiple; Tue, 15 Jun 2010 11:20:48 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OOLId-0003KV-9d; Tue, 15 Jun 2010 11:50:47 +1000 Date: Tue, 15 Jun 2010 11:50:47 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: simplify xfs_vm_writepage Subject: Re: [PATCH 3/3] xfs: simplify xfs_vm_writepage Message-ID: <20100615015047.GO6590@dastard> References: <20100611161312.446670249@bombadil.infradead.org> <20100611161512.404472115@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100611161512.404472115@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: 1276566862 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32550 Rule breakdown below pts rule 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:13:15PM -0400, Christoph Hellwig wrote: > 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 Looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+277A+15+fromorbit.com=david@internode.on.net Mon Jun 14 20: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 (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5F1oR4v065790 for ; Mon, 14 Jun 2010 20:50:28 -0500 X-ASG-Debug-ID: 1276566782-09ca00f90000-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 1E9BB14CF1EE for ; Mon, 14 Jun 2010 18:53:02 -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 GYMEguPCojSQIIyN for ; Mon, 14 Jun 2010 18:53:02 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27769756-1927428 for multiple; Tue, 15 Jun 2010 11:23:01 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OOLKm-0003Ks-Og; Tue, 15 Jun 2010 11:53:00 +1000 Date: Tue, 15 Jun 2010 11:53:00 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: remove xfs_iput_new Subject: Re: [PATCH] xfs: remove xfs_iput_new Message-ID: <20100615015300.GP6590@dastard> References: <20100611161824.GA7556@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100611161824.GA7556@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: 1276566784 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0635 1.0000 -1.6154 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.62 X-Barracuda-Spam-Status: No, SCORE=-1.62 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32551 Rule breakdown below pts rule 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:18:24PM -0400, Christoph Hellwig wrote: > 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 Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From SRS0+AiuP+15+fromorbit.com=david@internode.on.net Mon Jun 14 21:17:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.2 required=5.0 tests=BAYES_00,HEADER_ESQ, J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5F2HWjZ066688 for ; Mon, 14 Jun 2010 21:17:32 -0500 X-ASG-Debug-ID: 1276568407-34da015f0000-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 AFE883C7A22 for ; Mon, 14 Jun 2010 19:20:07 -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 ESQ9ye9B5L5evERr for ; Mon, 14 Jun 2010 19:20:07 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28198389-1927428 for multiple; Tue, 15 Jun 2010 11:49:46 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OOLke-0003Mr-BL; Tue, 15 Jun 2010 12:19:44 +1000 Date: Tue, 15 Jun 2010 12:19:44 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com, npiggin@suse.de, viro@zeniv.linux.org.uk X-ASG-Orig-Subj: Re: [PATCH] xfs: new truncate sequence Subject: Re: [PATCH] xfs: new truncate sequence Message-ID: <20100615021944.GQ6590@dastard> References: <20100614091731.GA22088@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100614091731.GA22088@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: 1276568408 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32553 Rule breakdown below pts rule 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 05:17:31AM -0400, Christoph Hellwig wrote: > Convert XFS to the new truncate sequence. We still can have errors after > updating the file size in xfs_setattr, but these are real I/O errors and lead > to a transaction abort and filesystem shutdown, so they are not an issue. > > Errors from ->write_begin and write_end can now be handled correctly because > we can actually get rid of the delalloc extents while previous the buffer > state was stipped in block_invalidatepage. > > There is still no error handling for ->direct_IO, because doing so will need > some major restructuring given that we only have the iolock shared and do not > hold i_mutex at all. Fortunately leaving the normally allocated blocks behind > there is not a major issue and this will get cleaned up by xfs_free_eofblock > later. > > Note: the patch is against Al's vfs.git tree as that contains the nessecary > preparations. I'd prefer to get it applied there so that we can get some > testing in linux-next. > > Signed-off-by: Christoph Hellwig It looks sane, but I haven't done any testing on it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+0e448f5b76c0517233da+2487+infradead.org+hch@bombadil.srs.infradead.org Tue Jun 15 01:19: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 o5F6JVBA075725 for ; Tue, 15 Jun 2010 01:19:34 -0500 X-ASG-Debug-ID: 1276583139-1bb301330000-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 0F432AE9730 for ; Mon, 14 Jun 2010 23:25:39 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id NC3MDTQanp3HhOlx for ; Mon, 14 Jun 2010 23:25:39 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OOPXA-0001qi-BN; Tue, 15 Jun 2010 06:22:04 +0000 Date: Tue, 15 Jun 2010 02:22:04 -0400 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 2/3] xfs: simplify xfs_vm_releasepage Subject: Re: [PATCH 2/3] xfs: simplify xfs_vm_releasepage Message-ID: <20100615062204.GA6974@infradead.org> References: <20100611161312.446670249@bombadil.infradead.org> <20100611161511.791495868@bombadil.infradead.org> <20100615013737.GN6590@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100615013737.GN6590@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: 1276583140 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 15, 2010 at 11:37:37AM +1000, Dave Chinner wrote: > > + /* > > + * 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; > > + > > That's gone in mainline as of as of .35-rc3. We need to get the > xfs-dev tree updated. It's still in the XFS tree. Either we need to rebase that one, or sort it out during a merge. From andi@firstfloor.org Tue Jun 15 02:00:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5F70Ckj076943 for ; Tue, 15 Jun 2010 02:00:13 -0500 X-ASG-Debug-ID: 1276585578-158c03350000-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 7DAC2AE9983 for ; Tue, 15 Jun 2010 00:06:18 -0700 (PDT) Received: from one.firstfloor.org (one.firstfloor.org [213.235.205.2]) by cuda.sgi.com with ESMTP id Nx5tm8erIeRlJbjq for ; Tue, 15 Jun 2010 00:06:18 -0700 (PDT) Received: from basil.firstfloor.org (p5B3CB6AF.dip0.t-ipconnect.de [91.60.182.175]) by one.firstfloor.org (Postfix) with ESMTP id 0675C1A980C3; Tue, 15 Jun 2010 09:02:46 +0200 (CEST) Received: by basil.firstfloor.org (Postfix, from userid 1000) id 43AF7B1A2B; Tue, 15 Jun 2010 09:02:45 +0200 (CEST) Date: Tue, 15 Jun 2010 09:02:45 +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: <20100615070244.GD6727@basil.fritz.box> References: <20100610110.764742110@firstfloor.org> <20100610111052.3DDC5B1A2B@basil.firstfloor.org> <20100614042700.GC6590@dastard> <20100614074309.GA17092@basil.fritz.box> <20100614133755.GE6590@dastard> <20100614143720.GI17092@basil.fritz.box> <20100614222458.GF6590@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100614222458.GF6590@dastard> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: one.firstfloor.org[213.235.205.2] X-Barracuda-Start-Time: 1276585579 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32563 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean > We find out about corrupted filesystems all the time from users > sending mail to the list. Even if we did panic by default on > corruption events, kerneloops.org is *useless* for reporting them > because finding out about a corruption is only the very first step > of what is usually a long and involved process that requires user > interaction to gather information necessary to find the cause of the > corruption. The idea behind kerneloops.org is normally that any single report can be always a flake (broken memory, hardware, flipped bit whatever). An error becomes important and interesting when there are multiple occurrences of it in the field. > > Besides, if we _really_ want the machine to panic on corruption, BUG_ON is not panic normally. > then we configure the machine specifically for it via setting the > relevant corruption type bit in /proc/sys/fs/xfs/panic_mask. This is > generally only used when a developer asks a user to set it to get > kernel crash dumps triggered when a corruption event occurs so we > can do remote, offline analysis of the failure. Especially when you're talking about desktop class systems without ECC memory that will mean you'll spend at least some time on errors which are simply bit flips. > > That's standard Linux kernel development > > practice. Maybe XFS should catch up on that. > > I find this really amusing because linux filesystems have, over the This has really nothing to do with file systems, it's general practice for everything (well except XFS) > last few years, implemented a simpler version of XFS's way of > dealing with corruption events(*). Perhaps you should catch up > with the state of the art before throwing rocks, Andi.... I suspect you miss quite a lot of valuable information from your user base by not supporting kerneloops.org. On the other hand it would likely also save you from spending time on flakes. That said you don't need BUG_ON to support it (WARN etc. work too), it's just the easiest way. -Andi -- ak@linux.intel.com -- Speaking for myself only. From andi@firstfloor.org Tue Jun 15 02:22:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5F7MH2Q077563 for ; Tue, 15 Jun 2010 02:22:18 -0500 X-ASG-Debug-ID: 1276586905-586e00000000-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 2A81FAE9D77 for ; Tue, 15 Jun 2010 00:28:25 -0700 (PDT) Received: from one.firstfloor.org (one.firstfloor.org [213.235.205.2]) by cuda.sgi.com with ESMTP id Ow6BoKxkswLw39mi for ; Tue, 15 Jun 2010 00:28:25 -0700 (PDT) Received: from basil.firstfloor.org (p5B3CB6AF.dip0.t-ipconnect.de [91.60.182.175]) by one.firstfloor.org (Postfix) with ESMTP id 9385A1A980C3; Tue, 15 Jun 2010 09:24:52 +0200 (CEST) Received: by basil.firstfloor.org (Postfix, from userid 1000) id 11093B1A2B; Tue, 15 Jun 2010 09:24:52 +0200 (CEST) Date: Tue, 15 Jun 2010 09:24:52 +0200 From: Andi Kleen To: Dave Chinner Cc: Andi Kleen , Andi Kleen , Christoph Hellwig , dgc@fromorbit.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] XFS: Fix gcc 4.6 set but not read and unused statement warnings v2 Subject: Re: [PATCH] XFS: Fix gcc 4.6 set but not read and unused statement warnings v2 Message-ID: <20100615072452.GE6727@basil.fritz.box> References: <20100614081356.GA27499@basil.fritz.box> <20100614083021.GA29354@lst.de> <4C15EF75.5080909@linux.intel.com> <20100614124804.GA8547@lst.de> <20100614133958.GH17092@basil.fritz.box> <20100614163122.GB369@basil.fritz.box> <20100615005442.GL6590@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100615005442.GL6590@dastard> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: one.firstfloor.org[213.235.205.2] X-Barracuda-Start-Time: 1276586906 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32563 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean > I'm still not happy with it. With the BUG_ON? > > We'll commit a modified version of one of your patches into the XFS > tree as you seem unable to accept that changes might be necessary to > get your code to pass review. Sure modify however you like as long as you fix the warnings. Also it was good to have review on the cases it warned about, luckily there were no real bugs found. [BTW I should add there were some more mostly from array overflows. I have not investigated in detail, but I suspect they were harmless] My goal was also mostly to get my build reasonably warning free, but if I can't get this patch in I can also just disable the warning for fs/xfs. -Andi -- ak@linux.intel.com -- Speaking for myself only. From BATV+0e448f5b76c0517233da+2487+infradead.org+hch@bombadil.srs.infradead.org Tue Jun 15 02:38: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 o5F7c0sY078055 for ; Tue, 15 Jun 2010 02:38:02 -0500 X-ASG-Debug-ID: 1276587636-1e7700910000-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 A01221B1D357 for ; Tue, 15 Jun 2010 00:40:36 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Ng0mBuhPQQ1F3J7J for ; Tue, 15 Jun 2010 00:40:36 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OOQl2-0004vw-T0; Tue, 15 Jun 2010 07:40:28 +0000 Date: Tue, 15 Jun 2010 03:40:28 -0400 From: Christoph Hellwig To: Andi Kleen Cc: Dave Chinner , 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: <20100615074028.GA15322@infradead.org> References: <20100610110.764742110@firstfloor.org> <20100610111052.3DDC5B1A2B@basil.firstfloor.org> <20100614042700.GC6590@dastard> <20100614074309.GA17092@basil.fritz.box> <20100614133755.GE6590@dastard> <20100614143720.GI17092@basil.fritz.box> <20100614222458.GF6590@dastard> <20100615070244.GD6727@basil.fritz.box> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100615070244.GD6727@basil.fritz.box> 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: 1276587636 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 15, 2010 at 09:02:45AM +0200, Andi Kleen wrote: > I suspect you miss quite a lot of valuable information from > your user base by not supporting kerneloops.org. On the other > hand it would likely also save you from spending time on > flakes. > > That said you don't need BUG_ON to support it (WARN etc. work > too), it's just the easiest way. Note that a XFS filesystem shutdown already gives a stack trace. But picking up every filesystem shutdown on kerneloops.org seems to be quite a bit too much. It's usually due to IO errors from the underlying device. From andi@firstfloor.org Tue Jun 15 02:44: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 o5F7i8Wq078402 for ; Tue, 15 Jun 2010 02:44:08 -0500 X-ASG-Debug-ID: 1276588215-6069008c0000-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 6EF03AEA2F2 for ; Tue, 15 Jun 2010 00:50:15 -0700 (PDT) Received: from one.firstfloor.org (one.firstfloor.org [213.235.205.2]) by cuda.sgi.com with ESMTP id c7HrdpaHg3NLF6V4 for ; Tue, 15 Jun 2010 00:50:15 -0700 (PDT) Received: from basil.firstfloor.org (p5B3CB6AF.dip0.t-ipconnect.de [91.60.182.175]) by one.firstfloor.org (Postfix) with ESMTP id 9AC2D1A980C3; Tue, 15 Jun 2010 09:46:42 +0200 (CEST) Received: by basil.firstfloor.org (Postfix, from userid 1000) id 75E33B1A2B; Tue, 15 Jun 2010 09:46:41 +0200 (CEST) Date: Tue, 15 Jun 2010 09:46:41 +0200 From: Andi Kleen To: Christoph Hellwig Cc: Andi Kleen , Dave Chinner , 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: <20100615074641.GF6727@basil.fritz.box> References: <20100610110.764742110@firstfloor.org> <20100610111052.3DDC5B1A2B@basil.firstfloor.org> <20100614042700.GC6590@dastard> <20100614074309.GA17092@basil.fritz.box> <20100614133755.GE6590@dastard> <20100614143720.GI17092@basil.fritz.box> <20100614222458.GF6590@dastard> <20100615070244.GD6727@basil.fritz.box> <20100615074028.GA15322@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100615074028.GA15322@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: 1276588216 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32565 Rule breakdown below pts rule 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 15, 2010 at 03:40:28AM -0400, Christoph Hellwig wrote: > On Tue, Jun 15, 2010 at 09:02:45AM +0200, Andi Kleen wrote: > > I suspect you miss quite a lot of valuable information from > > your user base by not supporting kerneloops.org. On the other > > hand it would likely also save you from spending time on > > flakes. > > > > That said you don't need BUG_ON to support it (WARN etc. work > > too), it's just the easiest way. > > Note that a XFS filesystem shutdown already gives a stack trace. > But picking up every filesystem shutdown on kerneloops.org seems > to be quite a bit too much. It's usually due to IO errors from > the underlying device. Yes, but known race check asserts should be probably there, right? Maybe you need a special kind of ASSERT (or shutdown) for those? -Andi -- ak@linux.intel.com -- Speaking for myself only. From jack@suse.cz Tue Jun 15 04:52: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.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_62, J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5F9qodE082274 for ; Tue, 15 Jun 2010 04:52:50 -0500 X-ASG-Debug-ID: 1276595726-62ae027d0000-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 EEF5E3C8B6F for ; Tue, 15 Jun 2010 02:55:26 -0700 (PDT) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id RGM0F4W3JHn3MN5B for ; Tue, 15 Jun 2010 02:55:26 -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 784A95362F; Tue, 15 Jun 2010 11:55:25 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 5EE282B1BD1; Tue, 15 Jun 2010 11:55:05 +0200 (CEST) Date: Tue, 15 Jun 2010 11:55:05 +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: <20100615095505.GB3347@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: multipart/mixed; boundary="yEPQxsgoJgBvi8ip" Content-Disposition: inline In-Reply-To: <4C0FD43D.3040803@sandeen.net> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1276595726 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --yEPQxsgoJgBvi8ip Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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... OK, attached is an improvement to the XFSQA tests after which all quota tests pass for XFS just fine. The second patch is just minor general improvement of _require_scratch macro. Could they be added to XFSQA repository? Thanks. Honza -- Jan Kara SUSE Labs, CR --yEPQxsgoJgBvi8ip Content-Type: text/x-patch; charset=us-ascii Content-Disposition: attachment; filename="0001-Provide-generic-function-for-checking-quota-usage.patch" >From 5f184d21e781f1b14365c356e6c80030964aaaf7 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Thu, 10 Jun 2010 12:49:11 +0200 Subject: [PATCH 1/2] Provide generic function for checking quota usage Provide generic function _check_quota_usage for checking whether quota usage matches the space used and use it in proper tests. Signed-off-by: Jan Kara --- 231 | 18 +++--------------- 231.out | 6 ++++++ 232 | 14 +------------- 232.out | 2 ++ 233 | 14 +------------- 233.out | 2 ++ common.quota | 36 ++++++++++++++++++++++++++++++++++++ 7 files changed, 51 insertions(+), 41 deletions(-) diff --git a/231 b/231 index ebbe11e..e499c9a 100755 --- a/231 +++ b/231 @@ -49,18 +49,6 @@ s,$SCRATCH_DEV,[SCR_DEV],; print;" } -check_usage() -{ - quotaon -f -u -g $SCRATCH_MNT 2>/dev/null - repquota -u -g $SCRATCH_MNT | grep -v "^root" | filter_scratch \ - >$tmp.orig - quotacheck -u -g $SCRATCH_MNT 2>/dev/null - repquota -u -g $SCRATCH_MNT | grep -v "^root" | filter_scratch \ - >$tmp.checked - quotaon -u -g $SCRATCH_MNT 2>/dev/null - diff $tmp.orig $tmp.checked -} - _fsx() { tasks=$1 @@ -104,7 +92,7 @@ if ! _fsx 1; then exit fi -if ! check_usage; then +if ! _check_quota_usage; then umount $SCRATCH_DEV 2>/dev/null status=1 exit @@ -116,7 +104,7 @@ if ! _fsx 4; then exit fi -if ! check_usage; then +if ! _check_quota_usage; then umount $SCRATCH_DEV 2>/dev/null status=1 exit @@ -130,7 +118,7 @@ if ! _fsx 1; then exit fi -if ! check_usage; then +if ! _check_quota_usage; then umount $SCRATCH_DEV 2>/dev/null status=1 exit diff --git a/231.out b/231.out index 2f2d072..ef264a9 100644 --- a/231.out +++ b/231.out @@ -1,10 +1,16 @@ QA output created by 231 === FSX Standard Mode, Memory Mapping, 1 Tasks === All operations completed A-OK! +Comparing user usage +Comparing group usage === FSX Standard Mode, Memory Mapping, 4 Tasks === All operations completed A-OK! All operations completed A-OK! All operations completed A-OK! All operations completed A-OK! +Comparing user usage +Comparing group usage === FSX Standard Mode, Memory Mapping, 1 Tasks === All operations completed A-OK! +Comparing user usage +Comparing group usage diff --git a/232 b/232 index cf4d25a..d5f99bd 100755 --- a/232 +++ b/232 @@ -46,18 +46,6 @@ s,$SCRATCH_DEV,[SCR_DEV],; print;" } -check_usage() -{ - quotaon -f -u -g $SCRATCH_MNT 2>/dev/null - repquota -u -g -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | - sort >$tmp.orig - quotacheck -u -g $SCRATCH_MNT 2>/dev/null - repquota -u -g -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | - sort >$tmp.checked - quotaon -u -g $SCRATCH_MNT 2>/dev/null - diff $tmp.orig $tmp.checked -} - _filter_num() { tee -a $here/$seq.full |\ @@ -104,7 +92,7 @@ if ! _fsstress; then exit fi -if ! check_usage; then +if ! _check_quota_usage; then umount $SCRATCH_DEV 2>/dev/null status=1 exit diff --git a/232.out b/232.out index 744192e..ef82a89 100644 --- a/232.out +++ b/232.out @@ -4,3 +4,5 @@ Testing fsstress fsstress -n 2000 -d outdir -p 7 seed = S +Comparing user usage +Comparing group usage diff --git a/233 b/233 index b967e0d..5060931 100755 --- a/233 +++ b/233 @@ -50,18 +50,6 @@ s,$SCRATCH_DEV,[SCR_DEV],; print;" } -check_usage() -{ - quotaon -f -u -g $SCRATCH_MNT 2>/dev/null - repquota -u -g -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | - sort >$tmp.orig - quotacheck -u -g $SCRATCH_MNT 2>/dev/null - repquota -u -g -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | - sort >$tmp.checked - quotaon -u -g $SCRATCH_MNT 2>/dev/null - diff $tmp.orig $tmp.checked -} - _filter_num() { tee -a $here/$seq.full |\ @@ -113,7 +101,7 @@ if ! _fsstress; then exit fi -if ! check_usage; then +if ! _check_quota_usage; then umount $SCRATCH_DEV 2>/dev/null status=1 exit diff --git a/233.out b/233.out index 208910d..fa36ca3 100644 --- a/233.out +++ b/233.out @@ -4,3 +4,5 @@ Testing fsstress fsstress -z -f rmdir=20 -f link=10 -f creat=10 -f mkdir=10 -f unlink=20 -f symlink=10 -f rename=10 -f fsync=2 -f write=15 -f dwrite=15 -n 5000 -d outdir -p 7 seed = S +Comparing user usage +Comparing group usage diff --git a/common.quota b/common.quota index d32e285..655e34d 100644 --- a/common.quota +++ b/common.quota @@ -211,5 +211,41 @@ _qmount_option() echo "MOUNT_OPTIONS = $MOUNT_OPTIONS" >>$seq.full } +_check_quota_usage() +{ + # Sync to get delalloc to disk + sync + VFS_QUOTA=0 + if [ $FSTYP = "ext2" -o $FSTYP = "ext3" -o $FSTYP = "ext4" -o $FSTYP = "reiserfs" ]; then + VFS_QUOTA=1 + quotaon -f -u -g $SCRATCH_MNT 2>/dev/null + fi + repquota -u -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + sort >$tmp.user.orig + repquota -g -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + sort >$tmp.group.orig + if [ $VFS_QUOTA -eq 1 ]; then + quotacheck -u -g $SCRATCH_MNT 2>/dev/null + else + # use XFS method to force quotacheck + mount -o remount,noquota $SCRATCH_DEV + mount -o remount,usrquota,grpquota $SCRATCH_DEV + fi + repquota -u -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + sort >$tmp.user.checked + repquota -g -n $SCRATCH_MNT | grep -v "^#0" | filter_scratch | + sort >$tmp.group.checked + if [ $VFS_QUOTA -eq 1 ]; then + quotaon -u -g $SCRATCH_MNT 2>/dev/null + fi + { + echo "Comparing user usage" + diff $tmp.user.orig $tmp.user.checked + } && { + echo "Comparing group usage" + diff $tmp.group.orig $tmp.group.checked + } +} + # make sure this script returns success /bin/true -- 1.6.4.2 --yEPQxsgoJgBvi8ip Content-Type: text/x-patch; charset=us-ascii Content-Disposition: attachment; filename="0002-Add-test-for-correct-SCRATCH_MNT-into-_require_scrat.patch" >From d72c11b63aa22c920b460a71d4384c2f39be6513 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Tue, 15 Jun 2010 10:54:12 +0200 Subject: [PATCH 2/2] Add test for correct $SCRATCH_MNT into _require_scratch --- common.rc | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/common.rc b/common.rc index 6bf1e12..72997f9 100644 --- a/common.rc +++ b/common.rc @@ -703,6 +703,10 @@ _require_scratch() then _notrun "this test requires a valid \$SCRATCH_DEV" fi + if [ ! -d "$SCRATCH_MNT" ] + then + _notrun "this test requires a valid \$SCRATCH_MNT" + fi ;; esac -- 1.6.4.2 --yEPQxsgoJgBvi8ip-- From BATV+0e448f5b76c0517233da+2487+infradead.org+hch@bombadil.srs.infradead.org Tue Jun 15 06:18: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.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_62, J_CHICKENPOX_92 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5FBIEvG084738 for ; Tue, 15 Jun 2010 06:18:15 -0500 X-ASG-Debug-ID: 1276600851-667500e40000-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 8D2C01BDB75A for ; Tue, 15 Jun 2010 04:20:51 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 8XrmK0NfDbgZMi5B for ; Tue, 15 Jun 2010 04:20:51 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OOUCJ-0002m3-34; Tue, 15 Jun 2010 11:20:51 +0000 Date: Tue, 15 Jun 2010 07:20:51 -0400 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , 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: <20100615112051.GA25064@infradead.org> References: <20100608195905.GA577@infradead.org> <20100609072911.GI7869@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100609072911.GI7869@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: 1276600851 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 09, 2010 at 05:29:11PM +1000, Dave Chinner wrote: > All great - I attempted this myself - but it breaks bulkstat. See > xfstest 183: I can't reproduce the failure. And then I don't think we should prioritize bulkstate over metadata performance. The only major users of bulkstat on XFS in the mainline kernel is xfsdump, and metadata performance during normal loads is a lot more important. And the difference when using LVM/MD will be even larger with this as barriers are a lot more expensive there. What do you think about adding something like the patch below which always makes bulkstat always use the iget version which doesn't show this sort of problems. --- From: Christoph Hellwig Subject: xfs: always use iget in bulkstat The non-coherent bulkstat versionsthat look directly at the inode buffers causes various problems with performance optimizations that make increased use of just logging inodes. This patch makes bulkstat always use iget, which should be fast enough for normal use with the radix-tree based inode cache introduced a while ago. Signed-off-by: Christoph Hellwig --- linux-2.6/xfs_ioctl.c | 7 - linux-2.6/xfs_ioctl32.c | 12 -- quota/xfs_qm.c | 11 - quota/xfs_qm_syscalls.c | 16 +- xfs_itable.c | 281 ++++++------------------------------------------ xfs_itable.h | 14 -- 6 files changed, 59 insertions(+), 282 deletions(-) Index: xfs/fs/xfs/linux-2.6/xfs_ioctl.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl.c 2010-06-09 14:41:00.798002937 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_ioctl.c 2010-06-09 15:29:03.480005242 +0200 @@ -670,10 +670,9 @@ xfs_ioc_bulkstat( error = xfs_bulkstat_single(mp, &inlast, bulkreq.ubuffer, &done); else /* XFS_IOC_FSBULKSTAT */ - error = xfs_bulkstat(mp, &inlast, &count, - (bulkstat_one_pf)xfs_bulkstat_one, NULL, - sizeof(xfs_bstat_t), bulkreq.ubuffer, - BULKSTAT_FG_QUICK, &done); + error = xfs_bulkstat(mp, &inlast, &count, xfs_bulkstat_one, + sizeof(xfs_bstat_t), bulkreq.ubuffer, + &done); if (error) return -error; Index: xfs/fs/xfs/linux-2.6/xfs_ioctl32.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl32.c 2010-06-09 14:41:00.806011109 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_ioctl32.c 2010-06-09 15:29:03.480005242 +0200 @@ -233,15 +233,13 @@ xfs_bulkstat_one_compat( xfs_ino_t ino, /* inode number to get data for */ void __user *buffer, /* buffer to place output in */ int ubsize, /* size of buffer */ - void *private_data, /* my private data */ xfs_daddr_t bno, /* starting bno of inode cluster */ int *ubused, /* bytes used by me */ - void *dibuff, /* on-disk inode buffer */ int *stat) /* BULKSTAT_RV_... */ { return xfs_bulkstat_one_int(mp, ino, buffer, ubsize, xfs_bulkstat_one_fmt_compat, bno, - ubused, dibuff, stat); + ubused, stat); } /* copied from xfs_ioctl.c */ @@ -294,13 +292,11 @@ xfs_compat_ioc_bulkstat( int res; error = xfs_bulkstat_one_compat(mp, inlast, bulkreq.ubuffer, - sizeof(compat_xfs_bstat_t), - NULL, 0, NULL, NULL, &res); + sizeof(compat_xfs_bstat_t), 0, NULL, &res); } else if (cmd == XFS_IOC_FSBULKSTAT_32) { error = xfs_bulkstat(mp, &inlast, &count, - xfs_bulkstat_one_compat, NULL, - sizeof(compat_xfs_bstat_t), bulkreq.ubuffer, - BULKSTAT_FG_QUICK, &done); + xfs_bulkstat_one_compat, sizeof(compat_xfs_bstat_t), + bulkreq.ubuffer, &done); } else error = XFS_ERROR(EINVAL); if (error) Index: xfs/fs/xfs/quota/xfs_qm.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm.c 2010-06-09 14:41:00.816003775 +0200 +++ xfs/fs/xfs/quota/xfs_qm.c 2010-06-09 15:29:03.487003915 +0200 @@ -1625,10 +1625,8 @@ xfs_qm_dqusage_adjust( xfs_ino_t ino, /* inode number to get data for */ void __user *buffer, /* not used */ int ubsize, /* not used */ - void *private_data, /* not used */ xfs_daddr_t bno, /* starting block of inode cluster */ int *ubused, /* not used */ - void *dip, /* on-disk inode pointer (not used) */ int *res) /* result code value */ { xfs_inode_t *ip; @@ -1789,12 +1787,13 @@ xfs_qm_quotacheck( * Iterate thru all the inodes in the file system, * adjusting the corresponding dquot counters in core. */ - if ((error = xfs_bulkstat(mp, &lastino, &count, - xfs_qm_dqusage_adjust, NULL, - structsz, NULL, BULKSTAT_FG_IGET, &done))) + error = xfs_bulkstat(mp, &lastino, &count, + xfs_qm_dqusage_adjust, + structsz, NULL, &done); + if (error) break; - } while (! done); + } while (!done); /* * We've made all the changes that we need to make incore. Index: xfs/fs/xfs/quota/xfs_qm_syscalls.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_syscalls.c 2010-06-09 14:41:00.829004055 +0200 +++ xfs/fs/xfs/quota/xfs_qm_syscalls.c 2010-06-09 15:29:03.491003845 +0200 @@ -1095,10 +1095,8 @@ xfs_qm_internalqcheck_adjust( xfs_ino_t ino, /* inode number to get data for */ void __user *buffer, /* not used */ int ubsize, /* not used */ - void *private_data, /* not used */ xfs_daddr_t bno, /* starting block of inode cluster */ int *ubused, /* not used */ - void *dip, /* not used */ int *res) /* bulkstat result code */ { xfs_inode_t *ip; @@ -1191,15 +1189,15 @@ xfs_qm_internalqcheck( * Iterate thru all the inodes in the file system, * adjusting the corresponding dquot counters */ - if ((error = xfs_bulkstat(mp, &lastino, &count, - xfs_qm_internalqcheck_adjust, NULL, - 0, NULL, BULKSTAT_FG_IGET, &done))) { + error = xfs_bulkstat(mp, &lastino, &count, + xfs_qm_internalqcheck_adjust, + 0, NULL, &done); + if (error) { + cmn_err(CE_DEBUG, "Bulkstat returned error 0x%x", error); break; } - } while (! done); - if (error) { - cmn_err(CE_DEBUG, "Bulkstat returned error 0x%x", error); - } + } while (!done); + cmn_err(CE_DEBUG, "Checking results against system dquots"); for (i = 0; i < qmtest_hashmask; i++) { xfs_dqtest_t *d, *n; Index: xfs/fs/xfs/xfs_itable.c =================================================================== --- xfs.orig/fs/xfs/xfs_itable.c 2010-06-09 14:41:00.784003985 +0200 +++ xfs/fs/xfs/xfs_itable.c 2010-06-09 15:29:03.494004753 +0200 @@ -45,24 +45,41 @@ xfs_internal_inum( (ino == mp->m_sb.sb_uquotino || ino == mp->m_sb.sb_gquotino))); } -STATIC int -xfs_bulkstat_one_iget( - xfs_mount_t *mp, /* mount point for filesystem */ - xfs_ino_t ino, /* inode number to get data for */ - xfs_daddr_t bno, /* starting bno of inode cluster */ - xfs_bstat_t *buf, /* return buffer */ - int *stat) /* BULKSTAT_RV_... */ +/* + * Return stat information for one inode. + * Return 0 if ok, else errno. + */ +int +xfs_bulkstat_one_int( + struct xfs_mount *mp, /* mount point for filesystem */ + xfs_ino_t ino, /* inode to get data for */ + void __user *buffer, /* buffer to place output in */ + int ubsize, /* size of buffer */ + bulkstat_one_fmt_pf formatter, /* formatter, copy to user */ + xfs_daddr_t bno, /* starting bno of cluster */ + int *ubused, /* bytes used by me */ + int *stat) /* BULKSTAT_RV_... */ { - xfs_icdinode_t *dic; /* dinode core info pointer */ - xfs_inode_t *ip; /* incore inode pointer */ - struct inode *inode; - int error; + struct xfs_icdinode *dic; /* dinode core info pointer */ + struct xfs_inode *ip; /* incore inode pointer */ + struct inode *inode; + struct xfs_bstat *buf; /* return buffer */ + int error = 0; /* error value */ + + *stat = BULKSTAT_RV_NOTHING; + + if (!buffer || xfs_internal_inum(mp, ino)) + return XFS_ERROR(EINVAL); + + buf = kmem_alloc(sizeof(*buf), KM_SLEEP | KM_MAYFAIL); + if (!buf) + return XFS_ERROR(ENOMEM); error = xfs_iget(mp, NULL, ino, XFS_IGET_BULKSTAT, XFS_ILOCK_SHARED, &ip, bno); if (error) { *stat = BULKSTAT_RV_NOTHING; - return error; + goto out_free; } ASSERT(ip != NULL); @@ -123,77 +140,16 @@ xfs_bulkstat_one_iget( buf->bs_blocks = dic->di_nblocks + ip->i_delayed_blks; break; } - xfs_iput(ip, XFS_ILOCK_SHARED); - return error; -} -STATIC void -xfs_bulkstat_one_dinode( - xfs_mount_t *mp, /* mount point for filesystem */ - xfs_ino_t ino, /* inode number to get data for */ - xfs_dinode_t *dic, /* dinode inode pointer */ - xfs_bstat_t *buf) /* return buffer */ -{ - /* - * The inode format changed when we moved the link count and - * made it 32 bits long. If this is an old format inode, - * convert it in memory to look like a new one. If it gets - * flushed to disk we will convert back before flushing or - * logging it. We zero out the new projid field and the old link - * count field. We'll handle clearing the pad field (the remains - * of the old uuid field) when we actually convert the inode to - * the new format. We don't change the version number so that we - * can distinguish this from a real new format inode. - */ - if (dic->di_version == 1) { - buf->bs_nlink = be16_to_cpu(dic->di_onlink); - buf->bs_projid = 0; - } else { - buf->bs_nlink = be32_to_cpu(dic->di_nlink); - buf->bs_projid = be16_to_cpu(dic->di_projid); - } + error = formatter(buffer, ubsize, ubused, buf); - buf->bs_ino = ino; - buf->bs_mode = be16_to_cpu(dic->di_mode); - buf->bs_uid = be32_to_cpu(dic->di_uid); - buf->bs_gid = be32_to_cpu(dic->di_gid); - buf->bs_size = be64_to_cpu(dic->di_size); - buf->bs_atime.tv_sec = be32_to_cpu(dic->di_atime.t_sec); - buf->bs_atime.tv_nsec = be32_to_cpu(dic->di_atime.t_nsec); - buf->bs_mtime.tv_sec = be32_to_cpu(dic->di_mtime.t_sec); - buf->bs_mtime.tv_nsec = be32_to_cpu(dic->di_mtime.t_nsec); - buf->bs_ctime.tv_sec = be32_to_cpu(dic->di_ctime.t_sec); - buf->bs_ctime.tv_nsec = be32_to_cpu(dic->di_ctime.t_nsec); - buf->bs_xflags = xfs_dic2xflags(dic); - buf->bs_extsize = be32_to_cpu(dic->di_extsize) << mp->m_sb.sb_blocklog; - buf->bs_extents = be32_to_cpu(dic->di_nextents); - buf->bs_gen = be32_to_cpu(dic->di_gen); - memset(buf->bs_pad, 0, sizeof(buf->bs_pad)); - buf->bs_dmevmask = be32_to_cpu(dic->di_dmevmask); - buf->bs_dmstate = be16_to_cpu(dic->di_dmstate); - buf->bs_aextents = be16_to_cpu(dic->di_anextents); - buf->bs_forkoff = XFS_DFORK_BOFF(dic); + if (!error) + *stat = BULKSTAT_RV_DIDONE; - switch (dic->di_format) { - case XFS_DINODE_FMT_DEV: - buf->bs_rdev = xfs_dinode_get_rdev(dic); - buf->bs_blksize = BLKDEV_IOSIZE; - buf->bs_blocks = 0; - break; - case XFS_DINODE_FMT_LOCAL: - case XFS_DINODE_FMT_UUID: - buf->bs_rdev = 0; - buf->bs_blksize = mp->m_sb.sb_blocksize; - buf->bs_blocks = 0; - break; - case XFS_DINODE_FMT_EXTENTS: - case XFS_DINODE_FMT_BTREE: - buf->bs_rdev = 0; - buf->bs_blksize = mp->m_sb.sb_blocksize; - buf->bs_blocks = be64_to_cpu(dic->di_nblocks); - break; - } + out_free: + kmem_free(buf); + return error; } /* Return 0 on success or positive error */ @@ -213,118 +169,19 @@ xfs_bulkstat_one_fmt( return 0; } -/* - * Return stat information for one inode. - * Return 0 if ok, else errno. - */ -int /* error status */ -xfs_bulkstat_one_int( - xfs_mount_t *mp, /* mount point for filesystem */ - xfs_ino_t ino, /* inode number to get data for */ - void __user *buffer, /* buffer to place output in */ - int ubsize, /* size of buffer */ - bulkstat_one_fmt_pf formatter, /* formatter, copy to user */ - xfs_daddr_t bno, /* starting bno of inode cluster */ - int *ubused, /* bytes used by me */ - void *dibuff, /* on-disk inode buffer */ - int *stat) /* BULKSTAT_RV_... */ -{ - xfs_bstat_t *buf; /* return buffer */ - int error = 0; /* error value */ - xfs_dinode_t *dip; /* dinode inode pointer */ - - dip = (xfs_dinode_t *)dibuff; - *stat = BULKSTAT_RV_NOTHING; - - if (!buffer || xfs_internal_inum(mp, ino)) - return XFS_ERROR(EINVAL); - - buf = kmem_alloc(sizeof(*buf), KM_SLEEP); - - if (dip == NULL) { - /* We're not being passed a pointer to a dinode. This happens - * if BULKSTAT_FG_IGET is selected. Do the iget. - */ - error = xfs_bulkstat_one_iget(mp, ino, bno, buf, stat); - if (error) - goto out_free; - } else { - xfs_bulkstat_one_dinode(mp, ino, dip, buf); - } - - error = formatter(buffer, ubsize, ubused, buf); - if (error) - goto out_free; - - *stat = BULKSTAT_RV_DIDONE; - - out_free: - kmem_free(buf); - return error; -} - int xfs_bulkstat_one( xfs_mount_t *mp, /* mount point for filesystem */ xfs_ino_t ino, /* inode number to get data for */ void __user *buffer, /* buffer to place output in */ int ubsize, /* size of buffer */ - void *private_data, /* my private data */ xfs_daddr_t bno, /* starting bno of inode cluster */ int *ubused, /* bytes used by me */ - void *dibuff, /* on-disk inode buffer */ int *stat) /* BULKSTAT_RV_... */ { return xfs_bulkstat_one_int(mp, ino, buffer, ubsize, xfs_bulkstat_one_fmt, bno, - ubused, dibuff, stat); -} - -/* - * Test to see whether we can use the ondisk inode directly, based - * on the given bulkstat flags, filling in dipp accordingly. - * Returns zero if the inode is dodgey. - */ -STATIC int -xfs_bulkstat_use_dinode( - xfs_mount_t *mp, - int flags, - xfs_buf_t *bp, - int clustidx, - xfs_dinode_t **dipp) -{ - xfs_dinode_t *dip; - unsigned int aformat; - - *dipp = NULL; - if (!bp || (flags & BULKSTAT_FG_IGET)) - return 1; - dip = (xfs_dinode_t *) - xfs_buf_offset(bp, clustidx << mp->m_sb.sb_inodelog); - /* - * Check the buffer containing the on-disk inode for di_mode == 0. - * This is to prevent xfs_bulkstat from picking up just reclaimed - * inodes that have their in-core state initialized but not flushed - * to disk yet. This is a temporary hack that would require a proper - * fix in the future. - */ - if (be16_to_cpu(dip->di_magic) != XFS_DINODE_MAGIC || - !XFS_DINODE_GOOD_VERSION(dip->di_version) || - !dip->di_mode) - return 0; - if (flags & BULKSTAT_FG_QUICK) { - *dipp = dip; - return 1; - } - /* BULKSTAT_FG_INLINE: if attr fork is local, or not there, use it */ - aformat = dip->di_aformat; - if ((XFS_DFORK_Q(dip) == 0) || - (aformat == XFS_DINODE_FMT_LOCAL) || - (aformat == XFS_DINODE_FMT_EXTENTS && !dip->di_anextents)) { - *dipp = dip; - return 1; - } - return 1; + ubused, stat); } #define XFS_BULKSTAT_UBLEFT(ubleft) ((ubleft) >= statstruct_size) @@ -338,10 +195,8 @@ xfs_bulkstat( xfs_ino_t *lastinop, /* last inode returned */ int *ubcountp, /* size of buffer/count returned */ bulkstat_one_pf formatter, /* func that'd fill a single buf */ - void *private_data,/* private data for formatter */ size_t statstruct_size, /* sizeof struct filling */ char __user *ubuffer, /* buffer with inode stats */ - int flags, /* defined in xfs_itable.h */ int *done) /* 1 if there are more stats to get */ { xfs_agblock_t agbno=0;/* allocation group block number */ @@ -376,14 +231,12 @@ xfs_bulkstat( int ubelem; /* spaces used in user's buffer */ int ubused; /* bytes used by formatter */ xfs_buf_t *bp; /* ptr to on-disk inode cluster buf */ - xfs_dinode_t *dip; /* ptr into bp for specific inode */ /* * Get the last inode value, see if there's nothing to do. */ ino = (xfs_ino_t)*lastinop; lastino = ino; - dip = NULL; agno = XFS_INO_TO_AGNO(mp, ino); agino = XFS_INO_TO_AGINO(mp, ino); if (agno >= mp->m_sb.sb_agcount || @@ -608,37 +461,6 @@ xfs_bulkstat( irbp->ir_startino) + ((chunkidx & nimask) >> mp->m_sb.sb_inopblog); - - if (flags & (BULKSTAT_FG_QUICK | - BULKSTAT_FG_INLINE)) { - int offset; - - ino = XFS_AGINO_TO_INO(mp, agno, - agino); - bno = XFS_AGB_TO_DADDR(mp, agno, - agbno); - - /* - * Get the inode cluster buffer - */ - if (bp) - xfs_buf_relse(bp); - - error = xfs_inotobp(mp, NULL, ino, &dip, - &bp, &offset, - XFS_IGET_BULKSTAT); - - if (!error) - clustidx = offset / mp->m_sb.sb_inodesize; - if (XFS_TEST_ERROR(error != 0, - mp, XFS_ERRTAG_BULKSTAT_READ_CHUNK, - XFS_RANDOM_BULKSTAT_READ_CHUNK)) { - bp = NULL; - ubleft = 0; - rval = error; - break; - } - } } ino = XFS_AGINO_TO_INO(mp, agno, agino); bno = XFS_AGB_TO_DADDR(mp, agno, agbno); @@ -654,35 +476,13 @@ xfs_bulkstat( * when the chunk is used up. */ irbp->ir_freecount++; - if (!xfs_bulkstat_use_dinode(mp, flags, bp, - clustidx, &dip)) { - lastino = ino; - continue; - } - /* - * If we need to do an iget, cannot hold bp. - * Drop it, until starting the next cluster. - */ - if ((flags & BULKSTAT_FG_INLINE) && !dip) { - if (bp) - xfs_buf_relse(bp); - bp = NULL; - } /* * Get the inode and fill in a single buffer. - * BULKSTAT_FG_QUICK uses dip to fill it in. - * BULKSTAT_FG_IGET uses igets. - * BULKSTAT_FG_INLINE uses dip if we have an - * inline attr fork, else igets. - * See: xfs_bulkstat_one & xfs_dm_bulkstat_one. - * This is also used to count inodes/blks, etc - * in xfs_qm_quotacheck. */ ubused = statstruct_size; - error = formatter(mp, ino, ubufp, - ubleft, private_data, - bno, &ubused, dip, &fmterror); + error = formatter(mp, ino, ubufp, ubleft, bno, + &ubused, &fmterror); if (fmterror == BULKSTAT_RV_NOTHING) { if (error && error != ENOENT && error != EINVAL) { @@ -775,7 +575,7 @@ xfs_bulkstat_single( ino = (xfs_ino_t)*lastinop; error = xfs_bulkstat_one(mp, ino, buffer, sizeof(xfs_bstat_t), - NULL, 0, NULL, NULL, &res); + 0, NULL, &res); if (error) { /* * Special case way failed, do it the "long" way @@ -784,8 +584,7 @@ xfs_bulkstat_single( (*lastinop)--; count = 1; if (xfs_bulkstat(mp, lastinop, &count, xfs_bulkstat_one, - NULL, sizeof(xfs_bstat_t), buffer, - BULKSTAT_FG_IGET, done)) + sizeof(xfs_bstat_t), buffer, done)) return error; if (count == 0 || (xfs_ino_t)*lastinop != ino) return error == EFSCORRUPTED ? Index: xfs/fs/xfs/xfs_itable.h =================================================================== --- xfs.orig/fs/xfs/xfs_itable.h 2010-06-09 14:41:00.791011668 +0200 +++ xfs/fs/xfs/xfs_itable.h 2010-06-09 15:29:03.497004334 +0200 @@ -27,10 +27,8 @@ typedef int (*bulkstat_one_pf)(struct xf xfs_ino_t ino, void __user *buffer, int ubsize, - void *private_data, xfs_daddr_t bno, int *ubused, - void *dip, int *stat); /* @@ -41,13 +39,6 @@ typedef int (*bulkstat_one_pf)(struct xf #define BULKSTAT_RV_GIVEUP 2 /* - * Values for bulkstat flag argument. - */ -#define BULKSTAT_FG_IGET 0x1 /* Go through the buffer cache */ -#define BULKSTAT_FG_QUICK 0x2 /* No iget, walk the dinode cluster */ -#define BULKSTAT_FG_INLINE 0x4 /* No iget if inline attrs */ - -/* * Return stat information in bulk (by-inode) for the filesystem. */ int /* error status */ @@ -56,10 +47,8 @@ xfs_bulkstat( xfs_ino_t *lastino, /* last inode returned */ int *count, /* size of buffer/count returned */ bulkstat_one_pf formatter, /* func that'd fill a single buf */ - void *private_data, /* private data for formatter */ size_t statstruct_size,/* sizeof struct that we're filling */ char __user *ubuffer,/* buffer with inode stats */ - int flags, /* flag to control access method */ int *done); /* 1 if there are more stats to get */ int @@ -84,7 +73,6 @@ xfs_bulkstat_one_int( bulkstat_one_fmt_pf formatter, xfs_daddr_t bno, int *ubused, - void *dibuff, int *stat); int @@ -93,10 +81,8 @@ xfs_bulkstat_one( xfs_ino_t ino, void __user *buffer, int ubsize, - void *private_data, xfs_daddr_t bno, int *ubused, - void *dibuff, int *stat); typedef int (*inumbers_fmt_pf)( From BATV+0e448f5b76c0517233da+2487+infradead.org+hch@bombadil.srs.infradead.org Tue Jun 15 08:19: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.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5FDJle0088266 for ; Tue, 15 Jun 2010 08:19:48 -0500 X-ASG-Debug-ID: 1276608143-117003870000-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 BC28D3C959C for ; Tue, 15 Jun 2010 06:22:23 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id qTLOvgz5gxjMRS9w for ; Tue, 15 Jun 2010 06:22:23 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OOW5t-0004c5-Vd; Tue, 15 Jun 2010 13:22:21 +0000 Date: Tue, 15 Jun 2010 09:22:21 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: XFS status update for May 2010 Subject: XFS status update for May 2010 Message-ID: <20100615132221.GA17385@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: 1276608143 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean In May 2010 we saw the long awaited release of Linux 2.6.34, which includes a large XFS update. The most important features appearing in 2.6.34 was the new inode and quota flushing code, which leads to much better I/O patterns for metadata-intensive workloads. Additionally support for synchronous NFS exports has been improved to give much better performance, and performance for the fsync, fdatasync and sync system calls has been improved slightly. A bug when resizing extremely busy filesystems has been fixed, which required extensive modification to the data structure used for looking up the per-allocation group data. Last but not least there was a steady flow of minor bug fixes and cleanups, leading to the following diffstat from 2.6.33 to 2.6.34: 86 files changed, 3209 insertions(+), 3178 deletions(-) Meanwhile active development aimed at 2.6.35 merge progressed. The major feature for this window is the merge of the delayed logging code, which adds a new logging mode that dramatically reduces the bandwidth required for log I/O. See the documentation [1] for details. Testers for this new code are welcome. In userland xfsprogs saw the long awaited 3.1.2 release, which can be considered a bug fix release for xfs_repair, xfs_fsr and mkfs.xfs. After the release a few more fixes were merged into the development tree. The xfstests package saw various new tests, including many tests to exercise the quota code, and a few fixes to existing tests. [1] http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/filesystems/xfs-delayed-logging-design.txt;h=96d0df28bed323d5596fc051b0ffb96ed8e3c8df;hb=HEAD From SRS0+qVa5+16+fromorbit.com=david@internode.on.net Tue Jun 15 19:30: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 o5G0U4nC106608 for ; Tue, 15 Jun 2010 19:30:04 -0500 X-ASG-Debug-ID: 1276648358-57dc03950000-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 5485C1D5C5C2 for ; Tue, 15 Jun 2010 17:32:39 -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 iEm1tEAunQUkevcE for ; Tue, 15 Jun 2010 17:32:39 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 27863486-1927428 for multiple; Wed, 16 Jun 2010 10:02:37 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OOgYV-0004nS-Uq; Wed, 16 Jun 2010 10:32:35 +1000 Date: Wed, 16 Jun 2010 10:32:35 +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: <20100616003235.GU6590@dastard> References: <20100608195905.GA577@infradead.org> <20100609072911.GI7869@dastard> <20100615112051.GA25064@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100615112051.GA25064@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: 1276648360 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32627 Rule breakdown below pts rule 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 15, 2010 at 07:20:51AM -0400, Christoph Hellwig wrote: > On Wed, Jun 09, 2010 at 05:29:11PM +1000, Dave Chinner wrote: > > All great - I attempted this myself - but it breaks bulkstat. See > > xfstest 183: > > I can't reproduce the failure. And then I don't think we should > prioritize bulkstate over metadata performance. The only major users > of bulkstat on XFS in the mainline kernel is xfsdump, and metadata > performance during normal loads is a lot more important. And the > difference when using LVM/MD will be even larger with this as barriers > are a lot more expensive there. > > What do you think about adding something like the patch below which > always makes bulkstat always use the iget version which doesn't show > this sort of problems. The big advantage of the non-coherent bulkstat (apart from the order of magnitude performance increase it afforded) is that it doesn't cause the inode cache to grow and cause memory pressure. I was thinking that what I'd like a coherent bulkstat to do is if it causes a cache miss immediately mark the inode as reclaimable so that it gets turfed back out of the cache within a few seconds of bulkstat using it. This will keep the cache growth under control, and keep the speed of cache lookups fairly consistent. It also means we don't need to set up the VFS side of the inode, as this will be done anyway if we get a cache hit on a normal lookup of a reclaimable inode. If we convert back to coherent bulkstat, at minimum I'd like to make this change during the conversion to keep the per-inode CPU overhead at a minimum. The other thing I was thinking is a "bulk inode read" where we insert the entire cluster of inodes into the cache in a single operation. that way we don't have to keep calling the inode read code on every cache miss. With the above "insert as reclaimable inodes" it would significantly reduce the CPU overhead of populating the cache just for bulkstat. With this being done by a prefetch thread or two, we can leave the ioctl thread simply doing cache lookups and formatting.... The big question is what the SGI guys think of this - removing the non-cohenerent modes that are there for optimising specific DMF operations that are otherwise rather costly (i.e. BULKSTAT_FG_INLINE replaces bulkstat/open-by-handle/read xattr/close) and cause cache pollution. Are there ways to do this with coherent bulkstats? However, this raises the same issue with the removal of the remaining DMAPI hooks (that Alex wants more discussion on), so to me the big question is now this: how much of the XFS code that is there specifically for supporting SGI's proprietry applications should be maintained in mainline given that SGI already supports and maintains a separate XFS tree with the significant additional functionality necessary for those applications that is not in mainline.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Tue Jun 15 21:45: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 (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5G2jTjk110065 for ; Tue, 15 Jun 2010 21:45:29 -0500 X-ASG-Debug-ID: 1276656484-4ee100fd0000-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 E63063CDBD5 for ; Tue, 15 Jun 2010 19:48:04 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id 4admDWIAPUiQZSxQ for ; Tue, 15 Jun 2010 19:48:04 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id CB46742BAD36; Tue, 15 Jun 2010 21:48:03 -0500 (CDT) Message-ID: <4C183B63.5090306@sandeen.net> Date: Tue, 15 Jun 2010 21:48:03 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: Andi Kleen CC: Andi Kleen , Christoph Hellwig , dgc@fromorbit.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] XFS: Fix gcc 4.6 set but not read and unused statement warnings v2 Subject: Re: [PATCH] XFS: Fix gcc 4.6 set but not read and unused statement warnings v2 References: <20100614081356.GA27499@basil.fritz.box> <20100614083021.GA29354@lst.de> <4C15EF75.5080909@linux.intel.com> <20100614124804.GA8547@lst.de> <20100614133958.GH17092@basil.fritz.box> <20100614163122.GB369@basil.fritz.box> In-Reply-To: <20100614163122.GB369@basil.fritz.box> 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: 1276656484 X-Barracuda-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.32635 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 Andi Kleen wrote: > On Mon, Jun 14, 2010 at 03:39:58PM +0200, Andi Kleen wrote: >> On Mon, Jun 14, 2010 at 02:48:04PM +0200, Christoph Hellwig wrote: >>> On Mon, Jun 14, 2010 at 10:59:33AM +0200, Andi Kleen wrote: >>>>> How can this work? bp->data is a void pointer. >>>> It compiled with CONFIG_XFS_DEBUG enabled. Do I need to set some other >>>> option to test this? >>> It fails for me in a normal CONFIG_XFS_DEBUG build: >>> >>> fs/xfs/xfs_da_btree.c: In function 'xfs_da_root_join': >>> fs/xfs/xfs_da_btree.c:737: warning: dereferencing 'void *' pointer >>> fs/xfs/xfs_da_btree.c:737: error: request for member 'magic' in >>> something not a structure or union >>> fs/xfs/xfs_da_btree.c:737: warning: dereferencing 'void *' pointer >> >> Hmm, it really compiled here (scratching head) > > Never mind, it seems SUBDIRS doesn't set the DEBUG flag correctly. really? $ make SUBDIRS=fs/xfs CC [M] fs/xfs/linux-2.6/xfs_super.o fs/xfs/linux-2.6/xfs_super.c:73:2: error: #error DEBUG make[1]: *** [fs/xfs/linux-2.6/xfs_super.o] Error 1 $ grep -A3 XFS_DEBUG fs/xfs/linux-2.6/xfs_super.c #ifdef CONFIG_XFS_DEBUG #error DEBUG #endif (above just for testing) Offtopic I guess, but it sure seems to set it for me. -Eric From maria@ceiec.com Tue Jun 15 23:05:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.0 required=5.0 tests=BAYES_99 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 o5G4579M112260 for ; Tue, 15 Jun 2010 23:05:10 -0500 X-ASG-Debug-ID: 1276661477-4e22029b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from lineu.cb.ufrn.br (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4DE19AFDDD6 for ; Tue, 15 Jun 2010 21:11:18 -0700 (PDT) Received: from lineu.cb.ufrn.br (lineu.cb.ufrn.br [200.19.174.25]) by cuda.sgi.com with ESMTP id Qym1hPJBhP39sP66 for ; Tue, 15 Jun 2010 21:11:18 -0700 (PDT) Received: from cb.ufrn.br (localhost [127.0.0.1]) by lineu.cb.ufrn.br (Postfix) with ESMTP id 3EEA0B260CF; Wed, 16 Jun 2010 00:25:01 -0300 (BRT) From: "Maria Wong" Reply-To: chi.hangshi@gala.net X-ASG-Orig-Subj: Apply Now ...Part-Time Employment Offer...! Subject: Apply Now ...Part-Time Employment Offer...! Date: Wed, 16 Jun 2010 01:25:01 -0200 Message-Id: <20100616032405.M90509@cb.ufrn.br> X-Mailer: OpenWebMail 2.53 X-OriginatingIP: 78.138.3.235 (wogel) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 To: undisclosed-recipients:; X-Barracuda-Connect: lineu.cb.ufrn.br[200.19.174.25] X-Barracuda-Start-Time: 1276661480 X-Barracuda-Bayes: INNOCENT GLOBAL 0.6876 1.0000 1.2768 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.28 X-Barracuda-Spam-Status: No, SCORE=1.28 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32642 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Act as our representative in your region, based on 10% commission to you on whatever transaction made with our customers on behalf of this company. Reply to chi.hangshi@gala.net for more details Mr.Li Jiaobo. Sales Manager CEIEC BEIJING http://www.beiec.com/cn/ From michael.monnerie@is.it-management.at Wed Jun 16 01:08: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 o5G682rZ118237 for ; Wed, 16 Jun 2010 01:08:02 -0500 X-ASG-Debug-ID: 1276668852-512a03370000-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 A15C912AF215 for ; Tue, 15 Jun 2010 23:14:13 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id D2BAeXkXEXrOvZHR for ; Tue, 15 Jun 2010 23:14:13 -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 5C8AF17A for ; Wed, 16 Jun 2010 08:10:34 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id 60CB283C829 for ; Wed, 16 Jun 2010 08:10:23 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: XFS stack corruption: BUG: unable to handle kernel paging request Subject: XFS stack corruption: BUG: unable to handle kernel paging request Date: Wed, 16 Jun 2010 08:10:23 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart6619890.oC9upicNQC"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201006160810.33045@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1276668854 X-Barracuda-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.32650 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 --nextPart6619890.oC9upicNQC Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable This happened while I did an "rsync" to that server, and it was searching t= he files to sync. Messages grabbed from the console: [2188628.147321] BUG: unable to handle kernel paging request at 00000005231= 1ba18 [2188628.147339] IP: [] dequeue_task+0x72/0x110 [2188628.147357] PGD 126a3067 PUD 0=20 [2188628.147362] Thread overran stack, or stack corrupted [2188628.147366] Oops: 0000 [#1] SMP=20 [2188628.147372] last sysfs file: /sys/devices/xen/vif-1/modalias [2188628.147376] CPU 0=20 [2188628.147380] Modules linked in: nls_utf8 nfs lockd fscache nfs_acl auth= _rpcgss sunrpc ipv6 ramzswap xvmalloc lzo_decompress lzo_compress loop dm_m= od reiserfs xfs exportfs xennet xenblk cdrom [2188628.147412] Pid: 30719, comm: pdflush Not tainted 2.6.31.12-0.2-xen #1= =20 [2188628.147416] RIP: e030:[] [] deque= ue_task+0x72/0x110 [2188628.147425] RSP: e02b:ffff88002719df20 EFLAGS: 00010006 [2188628.147428] RAX: 000000000000a380 RBX: ffff880022338340 RCX: 00000000b= 453311b [2188628.147432] RDX: 0000000000000001 RSI: ffff880022338340 RDI: ffffc9000= 000a380 [2188628.147436] RBP: ffff88002719df40 R08: ffff88002719e000 R09: 000000000= 0000000 [2188628.147439] R10: 0000000001c9c356 R11: 0000000000000000 R12: 000000000= 0000000 [2188628.147443] R13: 00000001209bcf34 R14: ffffffff80841c00 R15: ffffffff8= 0841c00 [2188628.147450] FS: 00007fd59f9116f0(0000) GS:ffffc90000000000(0000) knlG= S:0000000000000000 sk+0x72/0x110 [2188628.147425] RSP: e02b:ffff88002719df20 EFLAGS: 00010006 [2188628.147428] RAX: 000000000000a380 RBX: ffff880022338340 RCX: 00000000b= 453311b [2188628.147432] RDX: 0000000000000001 RSI: ffff880022338340 RDI: ffffc9000= 000a380 [2188628.147436] RBP: ffff88002719df40 R08: ffff88002719e000 R09: 000000000= 0000000 [2188628.147439] R10: 0000000001c9c356 R11: 0000000000000000 R12: 000000000= 0000000 [2188628.147443] R13: 00000001209bcf34 R14: ffffffff80841c00 R15: ffffffff8= 0841c00 [2188628.147450] FS: 00007fd59f9116f0(0000) GS:ffffc90000000000(0000) knlG= S:0000000000000000 [2188628.147454] CS: e033 DS: 0000 ES: 0000 CR0: 000000008005003b [2188628.147458] CR2: 000000052311ba18 CR3: 0000000025a3f000 CR4: 000000000= 0000660 [2188628.147462] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 000000000= 0000000 [2188628.147466] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 000000000= 0000400 [2188628.147471] Process pdflush (pid: 30719, threadinfo ffff88002719e000, = task ffff880022338340) [2188628.147474] Stack: [2188628.147477] ffff88002719df70 00000000b453311b 62a8a813361341f2 ffffc9= 000000a380 [2188628.147484] <0> ffff88002719df70 ffffffff80034968 ffffc9000000a380 000= 00000b453311b [2188628.147492] <0> 00000001209bcf34 ffffc9000000a380 ffff88002719e080 fff= fffff8046c8fc [2188628.147501] Call Trace: [2188628.147516] [] deactivate_task+0x38/0x60 [2188628.147526] [] thread_return+0x157/0x3fb [2188628.147534] [] schedule_timeout+0x14d/0x200 [2188628.147541] [] io_schedule_timeout+0x80/0xf0 [2188628.147549] [] congestion_wait+0x7a/0xb0 [2188628.147589] [] _xfs_buf_lookup_pages+0x326/0x390 [x= fs] [2188628.147692] [] xfs_buf_get_flags+0x81/0x1a0 [xfs] [2188628.147785] [] xfs_buf_read_flags+0x26/0xd0 [xfs] [2188628.147877] [] xfs_trans_read_buf+0x1e9/0x320 [xfs] [2188628.147957] [] xfs_btree_read_buf_block+0x68/0xe0 [= xfs] [2188628.148005] [] xfs_btree_lookup_get_block+0x8e/0x11= 0 [xfs] [2188628.148021] [] xfs_btree_lookup+0xdf/0x4d0 [xfs] [2188628.148021] [] xfs_alloc_lookup_eq+0x27/0x50 [xfs] [2188628.148021] [] xfs_alloc_fixup_trees+0xc6/0x370 [xf= s] [2188628.148021] [] xfs_alloc_ag_vextent_near+0x4e0/0x9a= 0 [xfs] [2188628.148021] [] xfs_alloc_ag_vextent+0x105/0x160 [xf= s] [2188628.148021] [] xfs_alloc_vextent+0x204/0x4b0 [xfs] [2188628.148021] [] xfs_bmap_btalloc+0x18b/0xae0 [xfs] [2188628.148021] [] xfs_bmap_alloc+0x2f/0x70 [xfs] [2188628.148021] [] xfs_bmapi+0xc22/0x1320 [xfs] [2188628.148021] [] xfs_iomap_write_allocate+0x1d8/0x3f0= [xfs] [2188628.148021] [] xfs_iomap+0x2c9/0x300 [xfs] [2188628.148021] [] xfs_map_blocks+0x38/0x60 [xfs] =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/ --nextPart6619890.oC9upicNQC 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) iEYEABECAAYFAkwYatgACgkQzhSR9xwSCbQBsgCbBdekYdTv9f++tyj+2FyujDYm jlIAn0KhwNI/A9+S+hSwr+UTk1OJe4ko =Y8qE -----END PGP SIGNATURE----- --nextPart6619890.oC9upicNQC-- From ak@linux.intel.com Wed Jun 16 02:31:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5G7VIDt120861 for ; Wed, 16 Jun 2010 02:31:18 -0500 X-ASG-Debug-ID: 1276673851-35ee017e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mga02.intel.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3A3C112AF83B for ; Wed, 16 Jun 2010 00:37:32 -0700 (PDT) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by cuda.sgi.com with ESMTP id kxGuTqxb0jU26UpK for ; Wed, 16 Jun 2010 00:37:32 -0700 (PDT) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga101.jf.intel.com with ESMTP; 16 Jun 2010 00:33:51 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.53,425,1272870000"; d="scan'208";a="527356598" Received: from unknown (HELO [10.254.178.46]) ([10.254.178.46]) by orsmga002.jf.intel.com with ESMTP; 16 Jun 2010 00:33:51 -0700 Message-ID: <4C187E56.70601@linux.intel.com> Date: Wed, 16 Jun 2010 09:33:42 +0200 From: Andi Kleen User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: Eric Sandeen CC: Andi Kleen , Christoph Hellwig , dgc@fromorbit.com, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] XFS: Fix gcc 4.6 set but not read and unused statement warnings v2 Subject: Re: [PATCH] XFS: Fix gcc 4.6 set but not read and unused statement warnings v2 References: <20100614081356.GA27499@basil.fritz.box> <20100614083021.GA29354@lst.de> <4C15EF75.5080909@linux.intel.com> <20100614124804.GA8547@lst.de> <20100614133958.GH17092@basil.fritz.box> <20100614163122.GB369@basil.fritz.box> <4C183B63.5090306@sandeen.net> In-Reply-To: <4C183B63.5090306@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mga02.intel.com[134.134.136.20] X-Barracuda-Start-Time: 1276673852 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32656 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean > really? > > $ make SUBDIRS=fs/xfs > CC [M] fs/xfs/linux-2.6/xfs_super.o > fs/xfs/linux-2.6/xfs_super.c:73:2: error: #error DEBUG > make[1]: *** [fs/xfs/linux-2.6/xfs_super.o] Error 1 > > $ grep -A3 XFS_DEBUG fs/xfs/linux-2.6/xfs_super.c > #ifdef CONFIG_XFS_DEBUG > #error DEBUG > #endif > > (above just for testing) > > Offtopic I guess, but it sure seems to set it for me. You did a full build with XFS_DEBUG before without SUBDIRS, right? Kbuild puts the options into special .cmd files and I think those only get rebuild on a full build, not on a SUBDIRS build. So it never picked up the changed option for me. Anyways that's the current theory, haven't retested that. -Andi From rolek@bokxing.nl Wed Jun 16 04:10: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 o5G9AZTZ123670 for ; Wed, 16 Jun 2010 04:10:35 -0500 X-ASG-Debug-ID: 1276679807-36a303560000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bork.lsof.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 737C21598D87 for ; Wed, 16 Jun 2010 02:16:48 -0700 (PDT) Received: from bork.lsof.org (bork.lsof.org [87.253.148.42]) by cuda.sgi.com with ESMTP id K6Yk8TxonMSjDVE2 for ; Wed, 16 Jun 2010 02:16:48 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by bork.lsof.org (Postfix) with ESMTP id 46571BA3F for ; Wed, 16 Jun 2010 11:13:09 +0200 (CEST) Received: from bork.lsof.org ([127.0.0.1]) by localhost (bork.lsof.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id BlraG0UxLN7H for ; Wed, 16 Jun 2010 11:13:07 +0200 (CEST) Received: from bork.lsof.org (localhost [127.0.0.1]) by bork.lsof.org (Postfix) with ESMTP id 32833B98D for ; Wed, 16 Jun 2010 11:13:07 +0200 (CEST) References: <20100615132221.GA17385@infradead.org> Message-ID: X-Mailer: http://www.courier-mta.org/cone/ From: Roel van Meer To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS status update for May 2010 Subject: Re: XFS status update for May 2010 Date: Wed, 16 Jun 2010 11:13:07 +0200 Mime-Version: 1.0 Content-Type: text/plain; format=flowed; charset="US-ASCII" Content-Disposition: inline Content-Transfer-Encoding: 7bit X-Barracuda-Connect: bork.lsof.org[87.253.148.42] X-Barracuda-Start-Time: 1276679809 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0018 1.0000 -2.0091 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.32662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig writes: > Meanwhile active development aimed at 2.6.35 merge progressed. The > major feature for this window is the merge of the delayed logging code, > which adds a new logging mode that dramatically reduces the bandwidth > required for log I/O. See the documentation [1] for details. Testers > for this new code are welcome. As of today I'm running 2.6.35-rc3 with XFS and delayed logging on a 4GB software raid0 we use to do nightly builds of about 150 software packages (kernel, samba, etc) on Slackware 10.1. If there's anything specific I can do, please let me know. I have some more hardware around to test with. By the way: thanks for these monthly status updates: they're really useful! Regards, roel From BATV+21cb88d0865851a33e05+2488+infradead.org+hch@bombadil.srs.infradead.org Wed Jun 16 04:38:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5G9camk124367 for ; Wed, 16 Jun 2010 04:38:38 -0500 X-ASG-Debug-ID: 1276681491-21ca01470000-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 14C4CB00C19 for ; Wed, 16 Jun 2010 02:44:51 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id Kyhkhc4PEU49rqJ8 for ; Wed, 16 Jun 2010 02:44:51 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OOp7Q-00030V-K6; Wed, 16 Jun 2010 09:41:12 +0000 Date: Wed, 16 Jun 2010 05:41:12 -0400 From: Christoph Hellwig To: Michael Monnerie Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS stack corruption: BUG: unable to handle kernel paging request Subject: Re: XFS stack corruption: BUG: unable to handle kernel paging request Message-ID: <20100616094112.GA16216@infradead.org> References: <201006160810.33045@zmi.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201006160810.33045@zmi.at> 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: 1276681492 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 16, 2010 at 08:10:23AM +0200, Michael Monnerie wrote: > This happened while I did an "rsync" to that server, and it was searching the files to sync. > Messages grabbed from the console: This might as well be another stack overflow. You don't happen to have more lines of the stack trace? I fear this might be another case of direct reclaim hitting you. Try backporting commit 070ecdca54dde9577d2697088e74e45568f48efb "xfs: skip writeback from reclaim context", that should get rid of places calling into ->writepage with already deep stack usage. From BATV+21cb88d0865851a33e05+2488+infradead.org+hch@bombadil.srs.infradead.org Wed Jun 16 04:39:26 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5G9dPYn124400 for ; Wed, 16 Jun 2010 04:39:26 -0500 X-ASG-Debug-ID: 1276681322-532100f40000-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 1FE9A14DF969 for ; Wed, 16 Jun 2010 02:42:03 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id lZcUfAdoVEcxpAdl for ; Wed, 16 Jun 2010 02:42:03 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OOp8C-0004mW-8V; Wed, 16 Jun 2010 09:42:00 +0000 Date: Wed, 16 Jun 2010 05:42:00 -0400 From: Christoph Hellwig To: Roel van Meer Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS status update for May 2010 Subject: Re: XFS status update for May 2010 Message-ID: <20100616094200.GB16216@infradead.org> References: <20100615132221.GA17385@infradead.org> 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: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1276681323 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 16, 2010 at 11:13:07AM +0200, Roel van Meer wrote: > As of today I'm running 2.6.35-rc3 with XFS and delayed logging on a 4GB > software raid0 we use to do nightly builds of about 150 software > packages (kernel, samba, etc) on Slackware 10.1. > > If there's anything specific I can do, please let me know. I have > some more hardware around to test with. As long as things just work everything is perfect! If you have any performance numbers that compare to older kernel / the non delayed logging case for your workload we would certainly be interested in them. From michael.monnerie@is.it-management.at Wed Jun 16 05:22:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5GAMHKa125541 for ; Wed, 16 Jun 2010 05:22:18 -0500 X-ASG-Debug-ID: 1276684110-21c003bd0000-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 AC9E61599060 for ; Wed, 16 Jun 2010 03:28:31 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id hbDn8MH2Syu5FEBX for ; Wed, 16 Jun 2010 03:28:31 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id B416F17A; Wed, 16 Jun 2010 12:24:51 +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 8814383C829; Wed, 16 Jun 2010 12:24:40 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS stack corruption: BUG: unable to handle kernel paging request Subject: Re: XFS stack corruption: BUG: unable to handle kernel paging request Date: Wed, 16 Jun 2010 12:24:50 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) References: <201006160810.33045@zmi.at> <20100616094112.GA16216@infradead.org> In-Reply-To: <20100616094112.GA16216@infradead.org> Cc: Christoph Hellwig MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart2774406.fudCLS3Rcd"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201006161224.50941@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1276684111 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32666 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart2774406.fudCLS3Rcd Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Mittwoch, 16. Juni 2010 Christoph Hellwig wrote: > This might as well be another stack overflow. You don't happen to > have more lines of the stack trace? I fear this might be another > case of direct reclaim hitting you. Sorry, no. I thought it looks like it stuck, but that were the last=20 lines, and the VM didn't react anymore, I had to "force shutdown" it. =20 > Try backporting commit 070ecdca54dde9577d2697088e74e45568f48efb > "xfs: skip writeback from reclaim context", that should get rid of > places calling into ->writepage with already deep stack usage. =20 As I use a standard openSUSE 11.2 kernel, I'll report a bug at Novell=20 and they must fix it. Thank you! =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/ --nextPart2774406.fudCLS3Rcd 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) iEYEABECAAYFAkwYpnIACgkQzhSR9xwSCbQfawCePkqLGluD0PEgRVF1e34hmkvt u70AoLl9thJplcX370o8ZVc3T2SUXi4A =sZoH -----END PGP SIGNATURE----- --nextPart2774406.fudCLS3Rcd-- From michael.monnerie@is.it-management.at Wed Jun 16 05:32:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5GAWbY4125848 for ; Wed, 16 Jun 2010 05:32:37 -0500 X-ASG-Debug-ID: 1276684731-720400540000-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 DD672B0189F for ; Wed, 16 Jun 2010 03:38:51 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id m8ZUG3zF6CHEtl4R for ; Wed, 16 Jun 2010 03:38:51 -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 E0C9517A; Wed, 16 Jun 2010 12:35:11 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id BE3FD83C829; Wed, 16 Jun 2010 12:35:00 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS stack corruption: BUG: unable to handle kernel paging request Subject: Re: XFS stack corruption: BUG: unable to handle kernel paging request Date: Wed, 16 Jun 2010 12:35:10 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) Cc: Christoph Hellwig References: <201006160810.33045@zmi.at> <20100616094112.GA16216@infradead.org> In-Reply-To: <20100616094112.GA16216@infradead.org> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1629307.e8px6EeMu8"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201006161235.11172@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1276684731 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32668 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart1629307.e8px6EeMu8 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Mittwoch, 16. Juni 2010 Christoph Hellwig wrote: > Try backporting commit 070ecdca54dde9577d2697088e74e45568f48efb > "xfs: skip writeback from reclaim context", that should get rid of > places calling into ->writepage with already deep stack usage. I 've just entered bug 614670 at Novell: https://bugzilla.novell.com/show_bug.cgi?id=3D614670 Just for reference. =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/ --nextPart1629307.e8px6EeMu8 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) iEYEABECAAYFAkwYqN8ACgkQzhSR9xwSCbT1hQCg4++hyuS8rn6IRtGzlp/PZYjw T5UAoJWqH/jR2lT+29o8+lLbztH4eBKR =sAin -----END PGP SIGNATURE----- --nextPart1629307.e8px6EeMu8-- From dan.j.rosenberg@gmail.com Wed Jun 16 08:04: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,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5GD4YK3130124 for ; Wed, 16 Jun 2010 08:04:34 -0500 X-ASG-Debug-ID: 1276693631-7d7202590000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-iw0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DED373D0345 for ; Wed, 16 Jun 2010 06:07:11 -0700 (PDT) Received: from mail-iw0-f181.google.com (mail-iw0-f181.google.com [209.85.214.181]) by cuda.sgi.com with ESMTP id PCQutOoNy774Za69 for ; Wed, 16 Jun 2010 06:07:11 -0700 (PDT) Received: by iwn33 with SMTP id 33so2864633iwn.26 for ; Wed, 16 Jun 2010 06:07:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:cc:content-type; bh=R7PXNlO4k6+9Ipqbl0Do1dO7fvP6KuAuEVbocSQRtQE=; b=HFmw2hAa/Fcl2VkC96Ij7j7p2sCdl/49WFnehzu2ESXCJXcOpmOdtv4MvNZPO5qKvN dtz5ZJFt+qC24DOjNPI4aHfZTvpILjYA2LwroaaTLTruWF+AzSdRYf9z89TVhwxPo1/S 4Kt2jOh+3pXefKgH410OI/qM416qVqj9vSqFs= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; b=kcpHaZ9+by9rEAwnWRSzbr438ezmZPZQLVdA/u/Wp9dDyDlPGD1c8NhykHwJrK0esm 8gQw/3VesM9SRkgcaqq71b9ulFcnmzO1434/m1AbLAt1Lcux8+0ZUO1hjq7r23emRCZb sF3wcW6rhdVuxxPw5NzT1pvsGpHHtLvQj18uQ= MIME-Version: 1.0 Received: by 10.231.184.75 with SMTP id cj11mr9525721ibb.51.1276693630388; Wed, 16 Jun 2010 06:07:10 -0700 (PDT) Received: by 10.231.200.197 with HTTP; Wed, 16 Jun 2010 06:07:10 -0700 (PDT) In-Reply-To: <20100616121142.GA22317@infradead.org> References: <20100616121142.GA22317@infradead.org> Date: Wed, 16 Jun 2010 09:07:10 -0400 Message-ID: X-ASG-Orig-Subj: Re: [Security] XFS swapext ioctl minor security issues Subject: Re: [Security] XFS swapext ioctl minor security issues From: Dan Rosenberg To: Christoph Hellwig , xfs@oss.sgi.com Cc: Eugene Teo , aelder@sgi.com, security@kernel.org Content-Type: multipart/mixed; boundary=0016367d6dec5389d104892566fa X-Barracuda-Connect: mail-iw0-f181.google.com[209.85.214.181] X-Barracuda-Start-Time: 1276693631 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0070 1.0000 -1.9755 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.98 X-Barracuda-Spam-Status: No, SCORE=-1.98 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32677 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 --0016367d6dec5389d104892566fa Content-Type: text/plain; charset=ISO-8859-1 Sure thing. This patch is against 2.6.34, but it appears that it can apply to >= 2.6.25. Let me know if you need a fix for < 2.6.25. For those new to the conversation, this patch prevents user "foo" from using the SWAPEXT ioctl to swap a write-only file owned by user "bar" into a file owned by "foo" and subsequently reading it. It does so by checking that the file descriptors passed to the ioctl are also opened for reading. In addition, after swapping any suid/sgid bits should be cleared. -Dan On Wed, Jun 16, 2010 at 8:11 AM, Christoph Hellwig wrote: > Dan, can you please send your fixes to the XFS list so that we can > include them? > > --0016367d6dec5389d104892566fa Content-Type: text/x-patch; charset=US-ASCII; name="xfs-swapext-ioctl.patch" Content-Disposition: attachment; filename="xfs-swapext-ioctl.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gai65p1a0 LS0tIGZzL3hmcy94ZnNfZGZyYWcuYy5vcmlnICAgICAyMDEwLTA2LTE1IDA5OjE2OjA1LjAwMDAw MDAwMCAtMDQwMAorKysgZnMveGZzL3hmc19kZnJhZy5jICAyMDEwLTA2LTE1IDA5OjMwOjE3LjAw MDAwMDAwMCAtMDQwMApAQCAtNjksNyArNjksOSBAQCB4ZnNfc3dhcGV4dCgKICAgICAgICAgICAg ICAgIGdvdG8gb3V0OwogICAgICAgIH0KCi0gICAgICAgaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1P REVfV1JJVEUpIHx8IChmaWxlLT5mX2ZsYWdzICYgT19BUFBFTkQpKSB7CisgICAgICAgaWYgKCEo ZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHx8CisgICAgICAgICAgICEoZmlsZS0+Zl9tb2Rl ICYgRk1PREVfUkVBRCkgfHwKKyAgICAgICAgICAgIChmaWxlLT5mX2ZsYWdzICYgT19BUFBFTkQp KSB7CiAgICAgICAgICAgICAgICBlcnJvciA9IFhGU19FUlJPUihFQkFERik7CiAgICAgICAgICAg ICAgICBnb3RvIG91dF9wdXRfZmlsZTsKICAgICAgICB9CkBAIC04MSw3ICs4Myw4IEBAIHhmc19z d2FwZXh0KAogICAgICAgIH0KCiAgICAgICAgaWYgKCEodG1wX2ZpbGUtPmZfbW9kZSAmIEZNT0RF X1dSSVRFKSB8fAotICAgICAgICAgICAodG1wX2ZpbGUtPmZfZmxhZ3MgJiBPX0FQUEVORCkpIHsK KyAgICAgICAgICAgISh0bXBfZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgfHwKKyAgICAgICAg ICAgICh0bXBfZmlsZS0+Zl9mbGFncyAmIE9fQVBQRU5EKSkgewogICAgICAgICAgICAgICAgZXJy b3IgPSBYRlNfRVJST1IoRUJBREYpOwogICAgICAgICAgICAgICAgZ290byBvdXRfcHV0X3RtcF9m aWxlOwogICAgICAgIH0KQEAgLTExMiw2ICsxMTUsMTEgQEAgeGZzX3N3YXBleHQoCgogICAgICAg IGVycm9yID0geGZzX3N3YXBfZXh0ZW50cyhpcCwgdGlwLCBzeHApOwoKKyAgICAgICBpZighZXJy b3IpIHsKKyAgICAgICAgICAgICAgIGZpbGVfcmVtb3ZlX3N1aWQodG1wX2ZpbGUpOworICAgICAg ICAgICAgICAgZmlsZV9yZW1vdmVfc3VpZChmaWxlKTsKKyAgICAgICB9CisgCiAgb3V0X3B1dF90 bXBfZmlsZToKICAgICAgICBmcHV0KHRtcF9maWxlKTsKICBvdXRfcHV0X2ZpbGU6Cgo= --0016367d6dec5389d104892566fa-- From BATV+21cb88d0865851a33e05+2488+infradead.org+hch@bombadil.srs.infradead.org Wed Jun 16 08:31: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 o5GDVu9U130902 for ; Wed, 16 Jun 2010 08:31:57 -0500 X-ASG-Debug-ID: 1276695273-0d2001520000-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 0E3EE1E0DB3C; Wed, 16 Jun 2010 06:34:33 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id DuukeB41PG1GjqFG; Wed, 16 Jun 2010 06:34:33 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OOslF-00073F-CK; Wed, 16 Jun 2010 13:34:33 +0000 Date: Wed, 16 Jun 2010 09:34:33 -0400 From: Christoph Hellwig To: Dan Rosenberg Cc: Christoph Hellwig , xfs@oss.sgi.com, Eugene Teo , aelder@sgi.com, security@kernel.org X-ASG-Orig-Subj: Re: [Security] XFS swapext ioctl minor security issues Subject: Re: [Security] XFS swapext ioctl minor security issues Message-ID: <20100616133433.GA16437@infradead.org> References: <20100616121142.GA22317@infradead.org> 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: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1276695274 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 16, 2010 at 09:07:10AM -0400, Dan Rosenberg wrote: > Sure thing. This patch is against 2.6.34, but it appears that it can > apply to >= 2.6.25. Let me know if you need a fix for < 2.6.25. > > For those new to the conversation, this patch prevents user "foo" from > using the SWAPEXT ioctl to swap a write-only file owned by user "bar" > into a file owned by "foo" and subsequently reading it. It does so by > checking that the file descriptors passed to the ioctl are also opened > for reading. This part is okay. If you provide a Signed-off-by: line it can be put into the tree ASAP. > In addition, after swapping any suid/sgid bits should be > cleared. I'm still trying to understand this one. Clearly we do not want to simply drop the suid/sgid bits here - swapext is just supposed to optimize file layout, but not change i_mode. So if the suid bit really is a risk here we need to refuse to swapext it. What's the scenario here: - swapext is called by the owner and the suid bit is set, or the owner is member of the group and the sgid bit is set, this should be fine. - the caller is not the owner, but has write access to the file. an actual write to change the data by the user would already drop the bits, so in theory swapext should be fine. But we might lose some important metadata in extended attributes that previously might have made the file safe, say per-file capabilities. I'd love to here the exact scenario, but for let's play safe and refuse the swapex for that case, by doing something: /* * SGID without any exec bits is just a mandatory locking mark. */ #define is_sgid(mode) \ (((mode) & (S_ISGID|S_IXGRP)) == (S_ISGID|S_IXGRP)) ... struct inode *inode, *tmp_inode; ... inode = file->f_path.dentry->d_inode; tmp_inode = tmp_file->f_path.dentry->d_inode; ... error = XFS_ERROR(EPERM); if ((inode->i_mode & S_ISUID) && !is_owner_or_cap(inode)) goto out; if ((tmp_inode->i_mode & S_ISUID) && !is_owner_or_cap(tmp_inode)) goto out; if (is_sgid(inode->i_mode) && !in_group_p(inode->i_gid)) goto out; if (is_sgid(tmp_inode->i_mode) && !in_group_p(tmp_inode->i_gid)) goto out; From dan.j.rosenberg@gmail.com Wed Jun 16 08:55: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,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5GDt0fE131620 for ; Wed, 16 Jun 2010 08:55:00 -0500 X-ASG-Debug-ID: 1276696656-1cac01d70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-iw0-f181.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9523F3D06E7 for ; Wed, 16 Jun 2010 06:57:36 -0700 (PDT) Received: from mail-iw0-f181.google.com (mail-iw0-f181.google.com [209.85.214.181]) by cuda.sgi.com with ESMTP id tRLSRVHbADBj1Dud for ; Wed, 16 Jun 2010 06:57:36 -0700 (PDT) Received: by iwn33 with SMTP id 33so2906144iwn.26 for ; Wed, 16 Jun 2010 06:57:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=rdQLof4Ca3Mtl1MQJ1g1F3kTotdXTqIKCIaV6asNGeo=; b=kZrwiaB8lI5DTdHqvRBccJOzB1TTlzyxPEx26lnb+NjVYxbELAajuYWC3Vqq2IaMeX jmT8P3+XbpvN496mthy7jij5RpYcSeJbQCVActkJgzxdBtcP7Yr8Ac/uVNpZgEbeUJdD L+Njw4mUqvbkiLuGcQD/w8k1rxBYk1Z+63LMw= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:content-transfer-encoding; b=LmVPN7aalCLFK0N1GGZ8qjjnnrYKG/N2Bn/CS8qW/DprJ6Gv4nJyNBhg5olkZ2kv22 /Se1OczT6YZtIlANzjDTTnbfyO7oSNNljwBqnyDE0CfL8r5D0KCqOcNqTmyBXoKSwqBW g2sV6RxH04QxWlfNfGEB1/JA/ATxNZH6CSNik= MIME-Version: 1.0 Received: by 10.42.7.7 with SMTP id c7mr3146779icc.20.1276696655742; Wed, 16 Jun 2010 06:57:35 -0700 (PDT) Received: by 10.231.200.197 with HTTP; Wed, 16 Jun 2010 06:57:35 -0700 (PDT) In-Reply-To: <20100616133433.GA16437@infradead.org> References: <20100616121142.GA22317@infradead.org> <20100616133433.GA16437@infradead.org> Date: Wed, 16 Jun 2010 09:57:35 -0400 Message-ID: X-ASG-Orig-Subj: Re: [Security] XFS swapext ioctl minor security issues Subject: Re: [Security] XFS swapext ioctl minor security issues From: Dan Rosenberg To: Christoph Hellwig Cc: xfs@oss.sgi.com, Eugene Teo , aelder@sgi.com, security@kernel.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-iw0-f181.google.com[209.85.214.181] X-Barracuda-Start-Time: 1276696657 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.32681 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean I removed the part of the patch dealing with suid/sgid bits - your reasoning seems good, we clearly don't want to just drop the suid/sgid bits. =A0I was just trying to point out the case where the caller is not the owner and has write access to the file; since in the ordinary case writing to that file would result in dropping the suid bit, I thought this ioctl should try to replicate that behavior. Signed-off-by: Dan Rosenberg diff -up fs/xfs/xfs_dfrag.c.orig fs/xfs/xfs_dfrag.c --- fs/xfs/xfs_dfrag.c.orig =A0 =A0 2010-06-15 09:16:05.000000000 -0400 +++ fs/xfs/xfs_dfrag.c =A02010-06-16 09:47:01.000000000 -0400 @@ -69,7 +69,9 @@ xfs_swapext( =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0goto out; =A0 =A0 =A0 =A0} - =A0 =A0 =A0 if (!(file->f_mode & FMODE_WRITE) || (file->f_flags & O_APPEN= D)) { + =A0 =A0 =A0 if (!(file->f_mode & FMODE_WRITE) || + =A0 =A0 =A0 =A0 =A0 !(file->f_mode & FMODE_READ) || + =A0 =A0 =A0 =A0 =A0 =A0(file->f_flags & O_APPEND)) { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0error =3D XFS_ERROR(EBADF); =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0goto out_put_file; =A0 =A0 =A0 =A0} @@ -81,7 +83,8 @@ xfs_swapext( =A0 =A0 =A0 =A0} =A0 =A0 =A0 =A0if (!(tmp_file->f_mode & FMODE_WRITE) || - =A0 =A0 =A0 =A0 =A0 (tmp_file->f_flags & O_APPEND)) { + =A0 =A0 =A0 =A0 =A0 !(tmp_file->f_mode & FMODE_READ) || + =A0 =A0 =A0 =A0 =A0 =A0(tmp_file->f_flags & O_APPEND)) { =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0error =3D XFS_ERROR(EBADF); =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0goto out_put_tmp_file; =A0 =A0 =A0 =A0} On Wed, Jun 16, 2010 at 9:34 AM, Christoph Hellwig wrot= e: > On Wed, Jun 16, 2010 at 09:07:10AM -0400, Dan Rosenberg wrote: >> Sure thing. =A0This patch is against 2.6.34, but it appears that it can >> apply to >=3D 2.6.25. =A0Let me know if you need a fix for < 2.6.25. >> >> For those new to the conversation, this patch prevents user "foo" from >> using the SWAPEXT ioctl to swap a write-only file owned by user "bar" >> into a file owned by "foo" and subsequently reading it. =A0It does so by >> checking that the file descriptors passed to the ioctl are also opened >> for reading. > > This part is okay. =A0If you provide a Signed-off-by: line it > can be put into the tree ASAP. > >> In addition, after swapping any suid/sgid bits should be >> cleared. > > I'm still trying to understand this one. =A0Clearly we do not want to > simply drop the suid/sgid bits here - swapext is just supposed to > optimize file layout, but not change i_mode. =A0So if the suid bit > really is a risk here we need to refuse to swapext it. > > What's the scenario here: > > =A0- swapext is called by the owner and the suid bit is set, or > =A0 the owner is member of the group and the sgid bit is set, > =A0 this should be fine. > =A0- the caller is not the owner, but has write access to the file. > =A0 an actual write to change the data by the user would already drop > =A0 the bits, so in theory swapext should be fine. =A0But we might lose > =A0 some important metadata in extended attributes that previously > =A0 might have made the file safe, say per-file capabilities. > =A0 I'd love to here the exact scenario, but for let's play safe and > =A0 refuse the swapex for that case, by doing something: > > /* > =A0* SGID without any exec bits is just a mandatory locking mark. > =A0*/ > #define is_sgid(mode) \ > =A0 =A0 =A0 =A0(((mode) & (S_ISGID|S_IXGRP)) =3D=3D (S_ISGID|S_IXGRP)) > > ... > > =A0 =A0 =A0 =A0struct inode *inode, *tmp_inode; > > ... > > =A0 =A0 =A0 =A0inode =3D file->f_path.dentry->d_inode; > =A0 =A0 =A0 =A0tmp_inode =3D tmp_file->f_path.dentry->d_inode; > > ... > > =A0 =A0 =A0 =A0error =3D XFS_ERROR(EPERM); > =A0 =A0 =A0 =A0if ((inode->i_mode & S_ISUID) && !is_owner_or_cap(inode)) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0goto out; > =A0 =A0 =A0 =A0if ((tmp_inode->i_mode & S_ISUID) && !is_owner_or_cap(tmp_= inode)) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0goto out; > =A0 =A0 =A0 =A0if (is_sgid(inode->i_mode) && !in_group_p(inode->i_gid)) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0goto out; > =A0 =A0 =A0 =A0if (is_sgid(tmp_inode->i_mode) && !in_group_p(tmp_inode->i= _gid)) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0goto out; > > > From michael.monnerie@is.it-management.at Wed Jun 16 09:32:00 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5GEW0SJ132675 for ; Wed, 16 Jun 2010 09:32:00 -0500 X-ASG-Debug-ID: 1276699094-493a03870000-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 AC45CB0176C for ; Wed, 16 Jun 2010 07:38:14 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id flAsTtilG9IXcBoj for ; Wed, 16 Jun 2010 07:38:14 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 9252817A for ; Wed, 16 Jun 2010 16:34:33 +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 24D1F83C829 for ; Wed, 16 Jun 2010 16:34:22 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: wrong man page of xfs_metadump Subject: wrong man page of xfs_metadump Date: Wed, 16 Jun 2010 16:34:32 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart4564665.AI9ZlAWqHW"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201006161634.32825@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1276699095 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0451 1.0000 -1.7305 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.73 X-Barracuda-Spam-Status: No, SCORE=-1.73 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32684 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart4564665.AI9ZlAWqHW Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable The man page says: xfs_metadump should only be used to copy unmounted filesystems, read- only mounted filesystems, or frozen filesystems (see xfs_freeze(8)). =20 Otherwise, the generated dump could be inconsistent or corrupt. I tried to use it nevertheless, but it doesn't run at all: xfs_metadump: /dev/orionStore/data contains a mounted and writable=20 filesystem fatal error -- couldn't initialize XFS library So the wording should better be xfs_metadump can only be used to copy unmounted filesystems, read-only=20 mounted filesystems, or frozen filesystems (see xfs_freeze(8)). It=20 refuses to work with r/w mounted filesystems. =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/ --nextPart4564665.AI9ZlAWqHW 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) iEYEABECAAYFAkwY4PgACgkQzhSR9xwSCbTVygCg6j5Jtc/pHv0OWbjeB2Hgp1FV sfMAoMwupMnGBEce44N7xYE3m4BuE/J+ =ii+n -----END PGP SIGNATURE----- --nextPart4564665.AI9ZlAWqHW-- From billie@ac-tech.com Wed Jun 16 11:20: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.8 required=5.0 tests=BAYES_50,RATWARE_HELO_DM 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 o5GGKTI4135771 for ; Wed, 16 Jun 2010 11:20:29 -0500 X-ASG-Debug-ID: 1276705602-4f8a028e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from alvin.ai.co.zw (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B3894159A935 for ; Wed, 16 Jun 2010 09:26:44 -0700 (PDT) Received: from alvin.ai.co.zw (mx7.ai.co.zw [41.221.159.50]) by cuda.sgi.com with ESMTP id xOZFpd8yMqqHahOr for ; Wed, 16 Jun 2010 09:26:44 -0700 (PDT) Received: from FBCL-MAIL-01.fbcl.fbch.corp (unknown [196.44.191.152]) by alvin.ai.co.zw (Postfix) with ESMTP id 893312831572; Wed, 16 Jun 2010 04:37:00 -0200 (GMT+2) Received: from DM ([194.0.0.245] RDNS failed) by FBCL-MAIL-01.fbcl.fbch.corp with Microsoft SMTPSVC(6.0.3790.4675); Wed, 16 Jun 2010 04:36:42 +0200 From: "awesome" To: adv-engineering@yandex.ru Cc: c.kreuzwieser@lenzing.com, xfs@oss.sgi.com, robocup-tech@symbio.jst.go.jp, ro03@txstate.edu, tammy@mgstevens.com, arc102@ntelos.net, newsletter@ciudad.com.ar X-ASG-Orig-Subj: re: dentist data Subject: re: dentist data Content-Type: text/plain; Content-Transfer-Encoding: 7Bit Message-ID: X-OriginalArrivalTime: 16 Jun 2010 02:36:43.0546 (UTC) FILETIME=[C1F3BFA0:01CB0CFC] Date: 16 Jun 2010 04:36:43 +0200 X-EsetResult: clean, is OK X-EsetId: 78259B27BB333C322369 X-Barracuda-Connect: mx7.ai.co.zw[41.221.159.50] X-Barracuda-Start-Time: 1276705605 X-Barracuda-Bayes: INNOCENT GLOBAL 0.3598 1.0000 -0.1191 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.12 X-Barracuda-Spam-Status: No, SCORE=-0.12 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32689 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Here's a business list package on sale this week only: Business List Silver Package Manufacturers Database - 1,057,119 records with 476,509 emails Real Estate Agents - 1 million records with emails US New Business Database - 4.8 million records all with emails Financial Planners Database - 148,857 records all with emails Finance and Money Professionals Database - 116,568 records all with emails All complete lists above: $345 There are more packages and not just for business. we also have healthcare, consumers and more. Contact me here for more info or to get samples: successandresults@gmx.com you must press here to stop the mail please email remfiles@gmx.com From SRS0+TCJd+17+fromorbit.com=dave@internode.on.net Wed Jun 16 21:21:31 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5H2LU2Y152915 for ; Wed, 16 Jun 2010 21:21:31 -0500 X-ASG-Debug-ID: 1276741445-5a6e00bf0000-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 B7ACC3D60AE for ; Wed, 16 Jun 2010 19:24:06 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id FAHMhXggiBz9Fca1 for ; Wed, 16 Jun 2010 19:24:06 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28032813-1927428 for ; Thu, 17 Jun 2010 11:54:04 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OP4lu-0006NO-Qt for xfs@oss.sgi.com; Thu, 17 Jun 2010 12:24:02 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OP4ls-0002OV-SJ for xfs@oss.sgi.com; Thu, 17 Jun 2010 12:24:00 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfsqa: test open_by_handle() on unlinked and freed inode clusters Subject: [PATCH] xfsqa: test open_by_handle() on unlinked and freed inode clusters Date: Thu, 17 Jun 2010 12:24:00 +1000 Message-Id: <1276741440-9178-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: 1276741447 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32730 Rule breakdown below pts rule 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 When Christoph and I were discussing bulkstat coherency on IRC, we realised that inode lookup from bulkstat was not actually looking up the inode allocation btree in xfs_imap() before reading the inode buffer from disk in xfs_iread(). Bulkstat uses the same lookup mechanism as handle validation to avoid shutting down the filesystem if inode numbers that point to non-inode buffers (i.e. invalid) are passed in the handle. The problem with this is that when we delete inodes from disk and we remove the inode chunk (i.e. deallocate inodes) we mark both the inodes in memory and the cluster buffer as stale, thereby preventing it from being written back to disk. The result of this is that some number of inodes remain on disk looking like allocated, in use inodes (i.e. di_mode is not zero). Hence if we get a cold cache lookup from a stale handle that references such an inode, we can read the inode off disk even though it has been deleted because we don't check if the inode is allocated or not. If the inode chunk has not been overwritten, then the inode read will succeed and the handle-to-dentry conversion will not error out like it is supposed to. The result is that stale NFS filehandles and open_by_handle() will succeed incorrectly on unlinked files for cold cache lookups. This is a bug that has been present ever since the inode chunk deletion code was implemented. This test exercises the problem and documents the hoops you have to jump through to reproduce it. Signed-off-by: Dave Chinner --- 238 | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 238.out | 2 ++ group | 1 + src/Makefile | 3 ++- 4 files changed, 62 insertions(+), 1 deletions(-) create mode 100755 238 create mode 100644 238.out diff --git a/238 b/238 new file mode 100755 index 0000000..47214b7 --- /dev/null +++ b/238 @@ -0,0 +1,57 @@ +#! /bin/bash +# FS QA Test No. $id +# +# what am I here for? +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=dchinner@redhat.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit $status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here + +# Modify as appropriate. +_supported_fs xfs +_supported_os Linux +_require_scratch + +echo "Silence is golden" + +_scratch_mkfs +_scratch_mount +src/stale_handle $SCRATCH_MNT +status=$? +exit diff --git a/238.out b/238.out new file mode 100644 index 0000000..9d5b672 --- /dev/null +++ b/238.out @@ -0,0 +1,2 @@ +QA output created by 238 +Silence is golden diff --git a/group b/group index 5c2d252..ee835d6 100644 --- a/group +++ b/group @@ -351,3 +351,4 @@ deprecated 235 auto quota quick 236 auto quick metadata 237 auto quick acl +238 auto quick metadata ioctl diff --git a/src/Makefile b/src/Makefile index 976133d..e878cff 100644 --- a/src/Makefile +++ b/src/Makefile @@ -15,7 +15,8 @@ TARGETS = dirstress fill fill2 getpagesize holes lstat64 \ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \ locktest unwritten_mmap bulkstat_unlink_test t_stripealign \ - bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable + bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable \ + stale_handle SUBDIRS = -- 1.7.1 From SRS0+m325+17+fromorbit.com=dave@internode.on.net Wed Jun 16 21:44:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-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 o5H2i9IB153579 for ; Wed, 16 Jun 2010 21:44:09 -0500 X-ASG-Debug-ID: 1276742804-201900e60000-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 320A914E67E2 for ; Wed, 16 Jun 2010 19:46:44 -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 7DLioufLVU9xGF4Z for ; Wed, 16 Jun 2010 19:46:44 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28078465-1927428 for ; Thu, 17 Jun 2010 12:16:43 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OP57p-0006OH-Vy for xfs@oss.sgi.com; Thu, 17 Jun 2010 12:46:42 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OP57o-0002ZF-7k for xfs@oss.sgi.com; Thu, 17 Jun 2010 12:46:40 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfsqa: test open_by_handle() on unlinked and freed inode clusters V2 Subject: [PATCH] xfsqa: test open_by_handle() on unlinked and freed inode clusters V2 Date: Thu, 17 Jun 2010 12:46:40 +1000 Message-Id: <1276742800-9845-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1276742806 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32730 Rule breakdown below pts rule 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 When Christoph and I were discussing bulkstat coherency on IRC, we realised that inode lookup from bulkstat was not actually looking up the inode allocation btree in xfs_imap() before reading the inode buffer from disk in xfs_iread(). Bulkstat uses the same lookup mechanism as handle validation to avoid shutting down the filesystem if inode numbers that point to non-inode buffers (i.e. invalid) are passed in the handle. The problem with this is that when we delete inodes from disk and we remove the inode chunk (i.e. deallocate inodes) we mark both the inodes in memory and the cluster buffer as stale, thereby preventing it from being written back to disk. The result of this is that some number of inodes remain on disk looking like allocated, in use inodes (i.e. di_mode is not zero). Hence if we get a cold cache lookup from a stale handle that references such an inode, we can read the inode off disk even though it has been deleted because we don't check if the inode is allocated or not. If the inode chunk has not been overwritten, then the inode read will succeed and the handle-to-dentry conversion will not error out like it is supposed to. The result is that stale NFS filehandles and open_by_handle() will succeed incorrectly on unlinked files for cold cache lookups. This is a bug that has been present ever since the inode chunk deletion code was implemented. This test exercises the problem and documents the hoops you have to jump through to reproduce it. Version 2: o suppress mkfs output that was unnoticed due to failure noise o fix exit value so test reports success correctly (e.g. when run with MOUNT_OPTIONS="-o ikeep") Signed-off-by: Dave Chinner --- 238 | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 238.out | 2 ++ group | 1 + src/Makefile | 3 ++- 4 files changed, 62 insertions(+), 1 deletions(-) create mode 100755 238 create mode 100644 238.out diff --git a/238 b/238 new file mode 100755 index 0000000..67146b6 --- /dev/null +++ b/238 @@ -0,0 +1,57 @@ +#! /bin/bash +# FS QA Test No. $id +# +# what am I here for? +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=dchinner@redhat.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here + +# Modify as appropriate. +_supported_fs xfs +_supported_os Linux +_require_scratch + +echo "Silence is golden" + +_scratch_mkfs > /dev/null 2>&1 +_scratch_mount > /dev/null 2>&1 +src/stale_handle $SCRATCH_MNT +status=$? +exit diff --git a/238.out b/238.out new file mode 100644 index 0000000..9d5b672 --- /dev/null +++ b/238.out @@ -0,0 +1,2 @@ +QA output created by 238 +Silence is golden diff --git a/group b/group index 5c2d252..ee835d6 100644 --- a/group +++ b/group @@ -351,3 +351,4 @@ deprecated 235 auto quota quick 236 auto quick metadata 237 auto quick acl +238 auto quick metadata ioctl diff --git a/src/Makefile b/src/Makefile index 976133d..e878cff 100644 --- a/src/Makefile +++ b/src/Makefile @@ -15,7 +15,8 @@ TARGETS = dirstress fill fill2 getpagesize holes lstat64 \ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \ locktest unwritten_mmap bulkstat_unlink_test t_stripealign \ - bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable + bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable \ + stale_handle SUBDIRS = -- 1.7.1 From BATV+737fdaa9b9dd55420eee+2489+infradead.org+hch@bombadil.srs.infradead.org Thu Jun 17 00:54: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 o5H5sM8Z163002 for ; Thu, 17 Jun 2010 00:54:25 -0500 X-ASG-Debug-ID: 1276754442-58bf00c40000-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 E7ED1B0B68F for ; Wed, 16 Jun 2010 23:00:42 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id YduyykBGx7GYo9Sp for ; Wed, 16 Jun 2010 23:00:42 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OP85x-00049g-VB; Thu, 17 Jun 2010 05:56:57 +0000 Date: Thu, 17 Jun 2010 01:56:57 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfsqa: test open_by_handle() on unlinked and freed inode clusters V2 Subject: Re: [PATCH] xfsqa: test open_by_handle() on unlinked and freed inode clusters V2 Message-ID: <20100617055657.GA5208@infradead.org> References: <1276742800-9845-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1276742800-9845-1-git-send-email-david@fromorbit.com> 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: 1276754442 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 patch is missing the new stale_handle.c file. From SRS0+m325+17+fromorbit.com=dave@internode.on.net Thu Jun 17 01:35: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.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_45,J_CHICKENPOX_75 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 o5H6ZJlY164796 for ; Thu, 17 Jun 2010 01:35:20 -0500 X-ASG-Debug-ID: 1276756897-58b9031a0000-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 51D56B0ACA1 for ; Wed, 16 Jun 2010 23:41:37 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id VABwg2OOYxvTZCwe for ; Wed, 16 Jun 2010 23:41:37 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28200299-1927428 for ; Thu, 17 Jun 2010 16:07:53 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OP8jN-0006ZD-SU for xfs@oss.sgi.com; Thu, 17 Jun 2010 16:37:41 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OP8jM-0003DT-0u for xfs@oss.sgi.com; Thu, 17 Jun 2010 16:37:40 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfsqa: test open_by_handle() on unlinked and freed inode clusters V2 Subject: [PATCH] xfsqa: test open_by_handle() on unlinked and freed inode clusters V2 Date: Thu, 17 Jun 2010 16:37:39 +1000 Message-Id: <1276756659-12338-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1276756899 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32747 Rule breakdown below pts rule 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 When Christoph and I were discussing bulkstat coherency on IRC, we realised that inode lookup from bulkstat was not actually looking up the inode allocation btree in xfs_imap() before reading the inode buffer from disk in xfs_iread(). Bulkstat uses the same lookup mechanism as handle validation to avoid shutting down the filesystem if inode numbers that point to non-inode buffers (i.e. invalid) are passed in the handle. The problem with this is that when we delete inodes from disk and we remove the inode chunk (i.e. deallocate inodes) we mark both the inodes in memory and the cluster buffer as stale, thereby preventing it from being written back to disk. The result of this is that some number of inodes remain on disk looking like allocated, in use inodes (i.e. di_mode is not zero). Hence if we get a cold cache lookup from a stale handle that references such an inode, we can read the inode off disk even though it has been deleted because we don't check if the inode is allocated or not. If the inode chunk has not been overwritten, then the inode read will succeed and the handle-to-dentry conversion will not error out like it is supposed to. The result is that stale NFS filehandles and open_by_handle() will succeed incorrectly on unlinked files for cold cache lookups. This is a bug that has been present ever since the inode chunk deletion code was implemented. This test exercises the problem and documents the hoops you have to jump through to reproduce it. Version 2: o suppress mkfs output that was unnoticed due to failure noise o fix exit value so test reports success correctly (e.g. when run with MOUNT_OPTIONS="-o ikeep") Signed-off-by: Dave Chinner --- 238 | 57 +++++++++++++++++++++ 238.out | 2 + group | 1 + src/Makefile | 3 +- src/stale_handle.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 202 insertions(+), 1 deletions(-) create mode 100755 238 create mode 100644 238.out create mode 100644 src/stale_handle.c diff --git a/238 b/238 new file mode 100755 index 0000000..4daca89 --- /dev/null +++ b/238 @@ -0,0 +1,57 @@ +#! /bin/bash +# FS QA Test No. 238 +# +# Check stale handles pointing to unlinked files are detected correctly +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=dchinner@redhat.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here + +# Modify as appropriate. +_supported_fs xfs +_supported_os Linux +_require_scratch + +echo "Silence is golden" + +_scratch_mkfs > /dev/null 2>&1 +_scratch_mount > /dev/null 2>&1 +src/stale_handle $SCRATCH_MNT +status=$? +exit diff --git a/238.out b/238.out new file mode 100644 index 0000000..9d5b672 --- /dev/null +++ b/238.out @@ -0,0 +1,2 @@ +QA output created by 238 +Silence is golden diff --git a/group b/group index 5c2d252..ee835d6 100644 --- a/group +++ b/group @@ -351,3 +351,4 @@ deprecated 235 auto quota quick 236 auto quick metadata 237 auto quick acl +238 auto quick metadata ioctl diff --git a/src/Makefile b/src/Makefile index 976133d..e878cff 100644 --- a/src/Makefile +++ b/src/Makefile @@ -15,7 +15,8 @@ TARGETS = dirstress fill fill2 getpagesize holes lstat64 \ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ preallo_rw_pattern_writer ftrunc trunc fs_perms testx looptest \ locktest unwritten_mmap bulkstat_unlink_test t_stripealign \ - bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable + bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable \ + stale_handle SUBDIRS = diff --git a/src/stale_handle.c b/src/stale_handle.c new file mode 100644 index 0000000..9b692f3 --- /dev/null +++ b/src/stale_handle.c @@ -0,0 +1,140 @@ +/* + * stale_handle.c - attempt to create a stale handle and open it + * + * Copyright (C) 2010 Red Hat, Inc. All Rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will 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 to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#define TEST_UTIME + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NUMFILES 1024 +int main(int argc, char **argv) +{ + int i; + int fd; + int ret; + int failed = 0; + char fname[MAXPATHLEN]; + char *test_dir; + void *handle[NUMFILES]; + size_t hlen[NUMFILES]; + char fshandle[256]; + size_t fshlen; + struct stat st; + + + if (argc != 2) { + fprintf(stderr, "usage: stale_handle test_dir\n"); + return EXIT_FAILURE; + } + + test_dir = argv[1]; + if (stat(test_dir, &st) != 0) { + perror("stat"); + return EXIT_FAILURE; + } + + ret = path_to_fshandle(test_dir, (void **)fshandle, &fshlen); + if (ret < 0) { + perror("path_to_fshandle"); + return EXIT_FAILURE; + } + + /* + * create a large number of files to force allocation of new inode + * chunks on disk. + */ + for (i=0; i < NUMFILES; i++) { + sprintf(fname, "%s/file%06d", test_dir, i); + fd = open(fname, O_RDWR | O_CREAT | O_TRUNC, 0644); + if (fd < 0) { + printf("Warning (%s,%d), open(%s) failed.\n", __FILE__, __LINE__, fname); + perror(fname); + return EXIT_FAILURE; + } + close(fd); + } + + /* sync to get the new inodes to hit the disk */ + sync(); + + /* create the handles */ + for (i=0; i < NUMFILES; i++) { + sprintf(fname, "%s/file%06d", test_dir, i); + ret = path_to_handle(fname, &handle[i], &hlen[i]); + if (ret < 0) { + perror("path_to_handle"); + return EXIT_FAILURE; + } + } + + /* unlink the files */ + for (i=0; i < NUMFILES; i++) { + sprintf(fname, "%s/file%06d", test_dir, i); + ret = unlink(fname); + if (ret < 0) { + perror("unlink"); + return EXIT_FAILURE; + } + } + + /* sync to get log forced for unlink transactions to hit the disk */ + sync(); + + /* sync once more FTW */ + sync(); + + /* + * now drop the caches so that unlinked inodes are reclaimed and + * buftarg page cache is emptied so that the inode cluster has to be + * fetched from disk again for the open_by_handle() call. + */ + system("echo 3 > /proc/sys/vm/drop_caches"); + + /* + * now try to open the files by the stored handles. Expecting ENOENT + * for all of them. + */ + for (i=0; i < NUMFILES; i++) { + errno = 0; + fd = open_by_handle(handle[i], hlen[i], O_RDWR); + if (fd < 0 && errno == ENOENT) { + free_handle(handle[i], hlen[i]); + continue; + } + if (ret >= 0) { + printf("open_by_handle(%d) opened an unlinked file!\n", i); + close(fd); + } else + printf("open_by_handle(%d) returned %d incorrectly on an unlinked file!\n", i, errno); + free_handle(handle[i], hlen[i]); + failed++; + } + if (failed) + return EXIT_FAILURE; + return EXIT_SUCCESS; +} -- 1.7.1 From SRS0+1LKB+17+fromorbit.com=david@internode.on.net Thu Jun 17 01:36:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 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 o5H6a5HS164825 for ; Thu, 17 Jun 2010 01:36:06 -0500 X-ASG-Debug-ID: 1276756721-79fb00880000-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 3E98E14EFADF for ; Wed, 16 Jun 2010 23:38:41 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id h24tc4LiZKmr0Jtw for ; Wed, 16 Jun 2010 23:38:41 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28247413-1927428 for multiple; Thu, 17 Jun 2010 16:08:40 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OP8kJ-0006ZL-EW; Thu, 17 Jun 2010 16:38:39 +1000 Date: Thu, 17 Jun 2010 16:38:39 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfsqa: test open_by_handle() on unlinked and freed inode clusters V2 Subject: Re: [PATCH] xfsqa: test open_by_handle() on unlinked and freed inode clusters V2 Message-ID: <20100617063839.GW6590@dastard> References: <1276742800-9845-1-git-send-email-david@fromorbit.com> <20100617055657.GA5208@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100617055657.GA5208@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: 1276756723 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.32746 Rule breakdown below pts rule 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 17, 2010 at 01:56:57AM -0400, Christoph Hellwig wrote: > The patch is missing the new stale_handle.c file. Ah, sorry - PEBKAC. Just resent it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From michael.monnerie@is.it-management.at Thu Jun 17 03:04:52 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5H84ppk167719 for ; Thu, 17 Jun 2010 03:04:52 -0500 X-ASG-Debug-ID: 1276762047-7d2501940000-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 7444C14F02EC for ; Thu, 17 Jun 2010 01:07:28 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id Fk7MpH9kERTkFWDB for ; Thu, 17 Jun 2010 01:07:28 -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 C217317A for ; Thu, 17 Jun 2010 10:07:26 +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 13A5B83C829 for ; Thu, 17 Jun 2010 10:07:14 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfsqa: test open_by_handle() on unlinked and freed inode clusters V2 Subject: Re: [PATCH] xfsqa: test open_by_handle() on unlinked and freed inode clusters V2 Date: Thu, 17 Jun 2010 10:07:25 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) References: <1276756659-12338-1-git-send-email-david@fromorbit.com> In-Reply-To: <1276756659-12338-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart3473232.CNg3zXGhNV"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201006171007.26040@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1276762048 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart3473232.CNg3zXGhNV Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Donnerstag, 17. Juni 2010 Dave Chinner wrote: > Hence if we get a cold cache lookup from a stale handle that > references such an inode, we can read the inode off disk even though > it has been deleted because we don't check if the inode is allocated > or not. If the inode chunk has not been overwritten, then the inode > read will succeed and the handle-to-dentry conversion will not error > out like it is supposed to. The result is that stale NFS filehandles > and open_by_handle() will succeed incorrectly on unlinked files for > cold cache lookups. =20 Wouldn't that qualify as a security problem and be handled as such?=20 There should be back ports for "long term support" kernels of security- sensitive people, and so on. =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/ --nextPart3473232.CNg3zXGhNV 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) iEYEABECAAYFAkwZ170ACgkQzhSR9xwSCbTrmQCgmkB3M3EZ0nDTth3DEykv3QpG /e8An3CQvLR8hu4vLJGHJqLcFgDRmHne =ZQA0 -----END PGP SIGNATURE----- --nextPart3473232.CNg3zXGhNV-- From tao.ma@oracle.com Thu Jun 17 03:53: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.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66, UNPARSEABLE_RELAY 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 o5H8rTrZ169512 for ; Thu, 17 Jun 2010 03:53:30 -0500 X-ASG-Debug-ID: 1276765189-6a87007a0000-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 90DD6159AF2F for ; Thu, 17 Jun 2010 01:59:49 -0700 (PDT) Received: from rcsinet10.oracle.com (rcsinet10.oracle.com [148.87.113.121]) by cuda.sgi.com with ESMTP id msaN9xgmEyHX032G for ; Thu, 17 Jun 2010 01:59:49 -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 o5H8tapp019744 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 17 Jun 2010 08:55:38 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 o5H8XSi9007497; Thu, 17 Jun 2010 08:55:30 GMT Received: from abhmt021.oracle.com by acsmt354.oracle.com with ESMTP id 333610241276764819; Thu, 17 Jun 2010 01:53:39 -0700 Received: from localhost.localdomain (/10.182.120.191) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 17 Jun 2010 01:53:38 -0700 From: Tao Ma To: xfs@oss.sgi.com Cc: linux-kernel@vger.kernel.org, Tao Ma , Dave Chinner , Alex Elder , Christoph Hellwig , Eric Sandeen 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. Date: Thu, 17 Jun 2010 16:53:19 +0800 Message-Id: <1276764799-4837-1-git-send-email-tao.ma@oracle.com> X-Mailer: git-send-email 1.7.0.4 In-Reply-To: <20100614122912.GD6590@dastard> References: <20100614122912.GD6590@dastard> X-Auth-Type: Internal IP X-Source-IP: acsinet15.oracle.com [141.146.126.227] X-CT-RefId: str=0001.0A090202.4C19E316.0040:SCFMA922111,ss=1,fgs=0 X-Barracuda-Connect: rcsinet10.oracle.com[148.87.113.121] X-Barracuda-Start-Time: 1276765190 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-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.32755 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 Hi Dave, On 06/14/2010 08:29 PM, Dave Chinner wrote: > I just had a thought - if you want to avoid holes being reported to > fiemap, then add a BMV_IF_NO_HOLES flag to xfs_getbmap() and skip > holes in the mappin gloop when this flag is set. That will make > fiemap fill in the full number of extents without hacking the > extent count... Here is the updated one. I have used BVM_IF_NO_HOLES in xfs_getbmap to skip increasing index 'cur_ext'. It is a bit ugly, see my commit log. I guess maybe we can add another flag in xfs_bmapi so that it don't even give us the holes? Regards, Tao >From cee1765ffd3e2b003b837666b4620b5107ed9ddd Mon Sep 17 00:00:00 2001 From: Tao Ma Date: Thu, 17 Jun 2010 16:14:22 +0800 Subject: [PATCH v3] xfs: Make fiemap works with sparse file. 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. This patch add a new parameter BMV_IF_NO_HOLES for bvm_iflags. So with this flags, we don't use our 'out' in xfs_getbmap for a hole. The solution is a bit ugly by just don't increasing index of 'out' vector. I felt that it is not easy to skip it at the very beginning since we have the complicated check and some function like xfs_getbmapx_fix_eof_hole to adjust 'out'. Cc: Dave Chinner Cc: Alex Elder Cc: Christoph Hellwig Cc: Eric Sandeen Signed-off-by: Tao Ma --- fs/xfs/linux-2.6/xfs_iops.c | 2 +- fs/xfs/xfs_bmap.c | 14 +++++++++++++- fs/xfs/xfs_fs.h | 4 +++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c index 9c8019c..505d5c0 100644 --- a/fs/xfs/linux-2.6/xfs_iops.c +++ b/fs/xfs/linux-2.6/xfs_iops.c @@ -677,7 +677,7 @@ xfs_vn_fiemap( fieinfo->fi_extents_max + 1; bm.bmv_count = min_t(__s32, bm.bmv_count, (PAGE_SIZE * 16 / sizeof(struct getbmapx))); - bm.bmv_iflags = BMV_IF_PREALLOC; + bm.bmv_iflags = BMV_IF_PREALLOC | BMV_IF_NO_HOLES; if (fieinfo->fi_flags & FIEMAP_FLAG_XATTR) bm.bmv_iflags |= BMV_IF_ATTRFORK; if (!(fieinfo->fi_flags & FIEMAP_FLAG_SYNC)) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 99587de..d49107d 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -5744,12 +5744,24 @@ xfs_getbmap( map[i].br_startblock)) goto out_free_map; - nexleft--; bmv->bmv_offset = out[cur_ext].bmv_offset + out[cur_ext].bmv_length; bmv->bmv_length = max_t(__int64_t, 0, bmvend - bmv->bmv_offset); + + /* + * In case we don't want to return the hole, + * don't increase cur_ext so that we can reuse + * it in the next loop. + */ + if ((iflags & BMV_IF_NO_HOLES) && + out[cur_ext].bmv_block == -1LL) { + memset(&out[cur_ext], 0, sizeof(out[cur_ext])); + continue; + } + + nexleft--; bmv->bmv_entries++; cur_ext++; } diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h index 7cf7220..87c2e9d 100644 --- a/fs/xfs/xfs_fs.h +++ b/fs/xfs/xfs_fs.h @@ -114,8 +114,10 @@ struct getbmapx { #define BMV_IF_NO_DMAPI_READ 0x2 /* Do not generate DMAPI read event */ #define BMV_IF_PREALLOC 0x4 /* rtn status BMV_OF_PREALLOC if req */ #define BMV_IF_DELALLOC 0x8 /* rtn status BMV_OF_DELALLOC if req */ +#define BMV_IF_NO_HOLES 0x10 /* Do not return holes */ #define BMV_IF_VALID \ - (BMV_IF_ATTRFORK|BMV_IF_NO_DMAPI_READ|BMV_IF_PREALLOC|BMV_IF_DELALLOC) + (BMV_IF_ATTRFORK|BMV_IF_NO_DMAPI_READ|BMV_IF_PREALLOC| \ + BMV_IF_DELALLOC|BMV_IF_NO_HOLES) /* bmv_oflags values - returned for each non-header segment */ #define BMV_OF_PREALLOC 0x1 /* segment = unwritten pre-allocation */ -- 1.5.5 From BATV+737fdaa9b9dd55420eee+2489+infradead.org+hch@bombadil.srs.infradead.org Thu Jun 17 06:38:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5HBcFQp175000 for ; Thu, 17 Jun 2010 06:38:18 -0500 X-ASG-Debug-ID: 1276774853-077300870000-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 898D914EDD98; Thu, 17 Jun 2010 04:40:53 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id iiZhTeovHVrb185X; Thu, 17 Jun 2010 04:40:53 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OPDSl-0006cv-5m; Thu, 17 Jun 2010 11:40:51 +0000 Date: Thu, 17 Jun 2010 07:40:51 -0400 From: Christoph Hellwig To: Dan Rosenberg Cc: Christoph Hellwig , security@kernel.org, aelder@sgi.com, Eugene Teo , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [Security] XFS swapext ioctl minor security issues Subject: Re: [Security] XFS swapext ioctl minor security issues Message-ID: <20100617114051.GA13118@infradead.org> References: <20100616121142.GA22317@infradead.org> <20100616133433.GA16437@infradead.org> 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: UNKNOWN[18.85.46.34] X-Barracuda-Start-Time: 1276774853 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 16, 2010 at 09:57:35AM -0400, Dan Rosenberg wrote: > I removed the part of the patch dealing with suid/sgid bits - your > reasoning seems good, we clearly don't want to just drop the suid/sgid > bits. ?I was just trying to point out the case where the caller is not > the owner and has write access to the file; since in the ordinary case > writing to that file would result in dropping the suid bit, I thought > this ioctl should try to replicate that behavior. Looks good, Reviewed-by: Christoph Hellwig Alex, can you push it to Linus ASAP? From thomas.forde@bergenofs.no Thu Jun 17 08:15: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.1 required=5.0 tests=BAYES_50,HTML_MESSAGE, 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 o5HDFte5177907 for ; Thu, 17 Jun 2010 08:15:56 -0500 X-ASG-Debug-ID: 1276780935-13a101a20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from dkcphmx22.softcom.dk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 322B6159BC6A for ; Thu, 17 Jun 2010 06:22:15 -0700 (PDT) Received: from dkcphmx22.softcom.dk (dkcphmx22.softcom.dk [213.150.41.59]) by cuda.sgi.com with ESMTP id GZQjUpDUgIpPneu3 for ; Thu, 17 Jun 2010 06:22:15 -0700 (PDT) Received: from 74.82-134-78.bkkb.no (82.134.78.74) by dkcphmx22.softcom.dk (envelope-from ) with ESMTP. tag msg.1276780709.62071.31020 (Processed in 1.292334 secs); 17 Jun 2010 13:18:30 -0000 X-SoftScan-Status: clean To: xfs@oss.sgi.com MIME-Version: 1.0 X-ASG-Orig-Subj: Help with XFS Subject: Help with XFS X-KeepSent: 4967B99D:609CC213-C1257745:0048E646; type=4; name=$KeepSent X-Mailer: Lotus Notes Release 8.5.1 FP3 May 24, 2010 Message-ID: From: =?ISO-8859-1?Q?Thomas_F=F8rde?= Date: Thu, 17 Jun 2010 15:18:26 +0200 X-MIMETrack: Serialize by Router on LNBOS01/BOS(Release 8.5.1|September 28, 2009) at 17.06.2010 15:18:28, Serialize complete at 17.06.2010 15:18:28 Content-Type: multipart/alternative; boundary="=_alternative 004919A2C1257745_=" X-Barracuda-Connect: dkcphmx22.softcom.dk[213.150.41.59] X-Barracuda-Start-Time: 1276780937 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32773 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multipart message in MIME format. --=_alternative 004919A2C1257745_= Content-Type: text/plain; charset="US-ASCII" during the other day our XFS filesystem had a unexpected shutdown according to logs. un 16 15:48:42 strmng04 kernel: 0x0: 00 00 c0 46 01 00 c0 46 77 02 c0 46 fe 7d 00 40 Jun 16 15:48:42 strmng04 kernel: Filesystem "sdf1": XFS internal error xfs_da_do_buf(2) at line 2276 of file /home/buildcentos/rpmbuild/BUILD/xfs-kmod-0.4/_kmod_build_smp/xfs_da_bt$ Jun 16 15:48:42 strmng04 kernel: Jun 16 15:48:42 strmng04 kernel: Call Trace:{:xfs:xfs_corruption_error+236} {:xfs:kmem_zone_alloc+66} Jun 16 15:48:42 strmng04 kernel: {:xfs:xfs_da_do_buf+1335} {:xfs:xfs_da_read_buf+21} Jun 16 15:48:42 strmng04 kernel: {:xfs:xfs_da_read_buf+21} {:xfs:xfs_dir2_block_lookup_int+71} Jun 16 15:48:42 strmng04 kernel: {:xfs:xfs_dir2_block_lookup_int+71} Jun 16 15:48:42 strmng04 kernel: {:xfs:xfs_dir2_block_lookup+19} {:xfs:xfs_dir2_lookup+200} Jun 16 15:48:42 strmng04 kernel: {__wake_up+54} {__up_read+16} Jun 16 15:48:42 strmng04 kernel: {:xfs:xfs_dir_lookup_int+53} {:xfs:xfs_lookup+74} Jun 16 15:48:42 strmng04 kernel: {:xfs:linvfs_lookup+48} {__lookup_hash+263} Jun 16 15:48:42 strmng04 kernel: {lookup_one_len+94} {:nfsd:nfsd_lookup+936} Jun 16 15:48:42 strmng04 kernel: {:nfsd:nfsd3_proc_lookup+198} {:nfsd:nfsd_dispatch+219} Jun 16 15:48:42 strmng04 kernel: {:sunrpc:svc_process+1227} {default_wake_function+0} Jun 16 15:48:42 strmng04 kernel: {:nfsd:nfsd+0} {:nfsd:nfsd+568} Jun 16 15:48:42 strmng04 kernel: {schedule_tail+55} {child_rip+8} Jun 16 15:48:42 strmng04 kernel: {:nfsd:nfsd+0} {:nfsd:nfsd+0} Jun 16 15:48:42 strmng04 kernel: {child_rip+0} many of those. and at the end Jun 16 15:50:13 strmng04 kernel: xfs_force_shutdown(sdf1,0x8) called from line 4092 of file /home/buildcentos/rpmbuild/BUILD/xfs-kmod-0.4/_kmod_build_smp/xfs_bmap.c. Return address = 0xffffffffa01f7fb4 Jun 16 15:50:13 strmng04 kernel: Filesystem "sdf1": Corruption of in-memory data detected. Shutting down filesystem: sdf1 Jun 16 15:50:13 strmng04 kernel: Please umount the filesystem, and rectify the problem(s) i have run xfs_check without any verbos information given i have run xfs_repair without any information errors fixed. when i try to mount the XFS filesystem of 10TB, my 7.8 TB of data is now gone. before: /dev/sdf1 10527858560 8801101708 1726756852 84% /D5 after: /dev/sdf1 10527858560 528 10527858032 1% /D5 help, where did my data go, and how can i get it back. --=_alternative 004919A2C1257745_= Content-Type: text/html; charset="US-ASCII" during the other day our XFS filesystem had a unexpected shutdown according to logs.

un 16 15:48:42 strmng04 kernel: 0x0: 00 00 c0 46 01 00 c0 46 77 02 c0 46 fe 7d 00 40
Jun 16 15:48:42 strmng04 kernel: Filesystem "sdf1": XFS internal error xfs_da_do_buf(2) at line 2276 of file /home/buildcentos/rpmbuild/BUILD/xfs-kmod-0.4/_kmod_build_smp/xfs_da_bt$
Jun 16 15:48:42 strmng04 kernel:
Jun 16 15:48:42 strmng04 kernel: Call Trace:<ffffffffa0211762>{:xfs:xfs_corruption_error+236} <ffffffffa023c7cc>{:xfs:kmem_zone_alloc+66}
Jun 16 15:48:42 strmng04 kernel:        <ffffffffa0202526>{:xfs:xfs_da_do_buf+1335} <ffffffffa0202653>{:xfs:xfs_da_read_buf+21}
Jun 16 15:48:42 strmng04 kernel:        <ffffffffa0202653>{:xfs:xfs_da_read_buf+21} <ffffffffa0207210>{:xfs:xfs_dir2_block_lookup_int+71}
Jun 16 15:48:42 strmng04 kernel:        <ffffffffa0207210>{:xfs:xfs_dir2_block_lookup_int+71}
Jun 16 15:48:42 strmng04 kernel:        <ffffffffa0207359>{:xfs:xfs_dir2_block_lookup+19} <ffffffffa0206457>{:xfs:xfs_dir2_lookup+200}
Jun 16 15:48:42 strmng04 kernel:        <ffffffff801347b0>{__wake_up+54} <ffffffff801ef3a1>{__up_read+16}
Jun 16 15:48:42 strmng04 kernel:        <ffffffffa0229d22>{:xfs:xfs_dir_lookup_int+53} <ffffffffa022e47d>{:xfs:xfs_lookup+74}
Jun 16 15:48:42 strmng04 kernel:        <ffffffffa02371e0>{:xfs:linvfs_lookup+48} <ffffffff80189fc5>{__lookup_hash+263}
Jun 16 15:48:42 strmng04 kernel:        <ffffffff8018a04f>{lookup_one_len+94} <ffffffffa03bd2bc>{:nfsd:nfsd_lookup+936}
Jun 16 15:48:42 strmng04 kernel:        <ffffffffa03c55fa>{:nfsd:nfsd3_proc_lookup+198} <ffffffffa03ba7dc>{:nfsd:nfsd_dispatch+219}
Jun 16 15:48:42 strmng04 kernel:        <ffffffffa03474ac>{:sunrpc:svc_process+1227} <ffffffff80134709>{default_wake_function+0}
Jun 16 15:48:42 strmng04 kernel:        <ffffffffa03ba31b>{:nfsd:nfsd+0} <ffffffffa03ba553>{:nfsd:nfsd+568}
Jun 16 15:48:42 strmng04 kernel:        <ffffffff80133470>{schedule_tail+55} <ffffffff80110fd3>{child_rip+8}
Jun 16 15:48:42 strmng04 kernel:        <ffffffffa03ba31b>{:nfsd:nfsd+0} <ffffffffa03ba31b>{:nfsd:nfsd+0}
Jun 16 15:48:42 strmng04 kernel:        <ffffffff80110fcb>{child_rip+0}

many of those. and at the end

Jun 16 15:50:13 strmng04 kernel: xfs_force_shutdown(sdf1,0x8) called from line 4092 of file /home/buildcentos/rpmbuild/BUILD/xfs-kmod-0.4/_kmod_build_smp/xfs_bmap.c.  Return address
 = 0xffffffffa01f7fb4
Jun 16 15:50:13 strmng04 kernel: Filesystem "sdf1": Corruption of in-memory data detected.  Shutting down filesystem: sdf1
Jun 16 15:50:13 strmng04 kernel: Please umount the filesystem, and rectify the problem(s)


i have run xfs_check without any verbos information given
i have run xfs_repair without any information errors fixed.

when i try to mount the XFS filesystem of 10TB, my 7.8 TB of data is now gone.

before:                /dev/sdf1            10527858560 8801101708 1726756852  84% /D5
after:                /dev/sdf1            10527858560       528 10527858032   1% /D5

help, where did my data go, and how can i get it back. --=_alternative 004919A2C1257745_=-- From michael.monnerie@is.it-management.at Thu Jun 17 10:12: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 o5HFCmei181517 for ; Thu, 17 Jun 2010 10:12:49 -0500 X-ASG-Debug-ID: 1276787725-2d9603830000-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 EAFE51E1062B for ; Thu, 17 Jun 2010 08:15:25 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id XkXMfbFA1G5d1pau for ; Thu, 17 Jun 2010 08:15:25 -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 9DB9017A for ; Thu, 17 Jun 2010 17:15: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 650BD83C829 for ; Thu, 17 Jun 2010 17:15:10 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS Date: Thu, 17 Jun 2010 17:15:22 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) References: In-Reply-To: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart10146408.0gHbBgKp89"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201006171715.22933@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1276787725 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0006 1.0000 -2.0169 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32780 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart10146408.0gHbBgKp89 Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable On Donnerstag, 17. Juni 2010 Thomas F=C3=B8rde wrote: > when i try to mount the XFS filesystem of 10TB, my 7.8 TB of data is > now gone. =20 Do you have any logs in /var/log/warn about errors before that crash? How long had that machine been up? What kernel version? How many files/dirs have there been? I'm not a dev, but I guess running xfs_metadump, zipping the outcome and=20 putting it on a website would be a good preparation. =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/ --nextPart10146408.0gHbBgKp89 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) iEYEABECAAYFAkwaPAoACgkQzhSR9xwSCbTZNwCeN2NaJIPsZ0OTfb57SPhCJHeL ZI4AoJwBkxWWQMG4RQ5PXYVlKJG+49bF =h4JM -----END PGP SIGNATURE----- --nextPart10146408.0gHbBgKp89-- From SRS0+npZu+17+fromorbit.com=david@internode.on.net Thu Jun 17 17:49:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5HMn0gg195049 for ; Thu, 17 Jun 2010 17:49:01 -0500 X-ASG-Debug-ID: 1276815096-077503010000-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 9905714F7378 for ; Thu, 17 Jun 2010 15:51:37 -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 zrBUGguGRmYcTuhe for ; Thu, 17 Jun 2010 15:51:37 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28181159-1927428 for multiple; Fri, 18 Jun 2010 08:21:31 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OPNvm-0007aK-37; Fri, 18 Jun 2010 08:51:30 +1000 Date: Fri, 18 Jun 2010 08:51:30 +1000 From: Dave Chinner To: Michael Monnerie Cc: xfs@oss.sgi.com, aelder@sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfsqa: test open_by_handle() on unlinked and freed inode clusters V2 Subject: Re: [PATCH] xfsqa: test open_by_handle() on unlinked and freed inode clusters V2 Message-ID: <20100617225130.GX6590@dastard> References: <1276756659-12338-1-git-send-email-david@fromorbit.com> <201006171007.26040@zmi.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201006171007.26040@zmi.at> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1276815098 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32812 Rule breakdown below pts rule 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 17, 2010 at 10:07:25AM +0200, Michael Monnerie wrote: > On Donnerstag, 17. Juni 2010 Dave Chinner wrote: > > Hence if we get a cold cache lookup from a stale handle that > > references such an inode, we can read the inode off disk even though > > it has been deleted because we don't check if the inode is allocated > > or not. If the inode chunk has not been overwritten, then the inode > > read will succeed and the handle-to-dentry conversion will not error > > out like it is supposed to. The result is that stale NFS filehandles > > and open_by_handle() will succeed incorrectly on unlinked files for > > cold cache lookups. > > Wouldn't that qualify as a security problem and be handled as such? > There should be back ports for "long term support" kernels of security- > sensitive people, and so on. Probably. Alex, are you able to handle this side of things? Note that local open_by_handle() use is not really an issue - it requires root and if you have root you can run xfs_db or dd on the block device to get the same information. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+DNhk+17+fromorbit.com=david@internode.on.net Thu Jun 17 18:48: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 (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5HNmdOk197530 for ; Thu, 17 Jun 2010 18:48:40 -0500 X-ASG-Debug-ID: 1276818676-583f005b0000-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 004CF14F7DCE for ; Thu, 17 Jun 2010 16:51:16 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id cSIVaneNMIdCSlTW for ; Thu, 17 Jun 2010 16:51:16 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28432305-1927428 for multiple; Fri, 18 Jun 2010 09:21:15 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OPOrZ-0007eg-OW; Fri, 18 Jun 2010 09:51:13 +1000 Date: Fri, 18 Jun 2010 09:51:13 +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: <20100617235113.GY6590@dastard> References: <20100608195905.GA577@infradead.org> <20100609072911.GI7869@dastard> <20100615112051.GA25064@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100615112051.GA25064@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: 1276818678 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32816 Rule breakdown below pts rule 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 15, 2010 at 07:20:51AM -0400, Christoph Hellwig wrote: > On Wed, Jun 09, 2010 at 05:29:11PM +1000, Dave Chinner wrote: > > All great - I attempted this myself - but it breaks bulkstat. See > > xfstest 183: > > I can't reproduce the failure. And then I don't think we should > prioritize bulkstate over metadata performance. The only major users > of bulkstat on XFS in the mainline kernel is xfsdump, and metadata > performance during normal loads is a lot more important. And the > difference when using LVM/MD will be even larger with this as barriers > are a lot more expensive there. > > What do you think about adding something like the patch below which > always makes bulkstat always use the iget version which doesn't show > this sort of problems. > > --- > > From: Christoph Hellwig > Subject: xfs: always use iget in bulkstat > > The non-coherent bulkstat versionsthat look directly at the inode > buffers causes various problems with performance optimizations that > make increased use of just logging inodes. This patch makes bulkstat > always use iget, which should be fast enough for normal use with the > radix-tree based inode cache introduced a while ago. > > Signed-off-by: Christoph Hellwig An important note: I think this patch is necessary to avoid bulkstat returning unlinked inodes when cache thrashing is occurring. The current non-coherent lookup will incorrectly return unlinked inodes if the inode cluster is marked stale, reclaimed and turfed from memory due to an unlink and memory pressure between the ialloc btree lookup and the cluster buffer read. The only way to avoid this is to ensure that the ialloc btree lookup and the formatting of the inode into the user buffer is atomic, which means we have to do a coherent lookup that returns a locked into.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+ffzZ+18+fromorbit.com=david@internode.on.net Thu Jun 17 19:45: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 o5I0j126199076 for ; Thu, 17 Jun 2010 19:45:02 -0500 X-ASG-Debug-ID: 1276822284-16c8024e0000-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 32E29159C2A6 for ; Thu, 17 Jun 2010 17:51:24 -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 hnhA1WPkVSSo7Svk for ; Thu, 17 Jun 2010 17:51:24 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28621490-1927428 for multiple; Fri, 18 Jun 2010 10:17:10 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OPPjg-0007hf-NW; Fri, 18 Jun 2010 10:47:08 +1000 Date: Fri, 18 Jun 2010 10:47:08 +1000 From: Dave Chinner To: Tao Ma Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Alex Elder , Christoph Hellwig , Eric Sandeen 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: <20100618004708.GZ6590@dastard> References: <20100614122912.GD6590@dastard> <1276764799-4837-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: <1276764799-4837-1-git-send-email-tao.ma@oracle.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1276822286 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32819 Rule breakdown below pts rule 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 17, 2010 at 04:53:19PM +0800, Tao Ma wrote: > Hi Dave, > On 06/14/2010 08:29 PM, Dave Chinner wrote: > > I just had a thought - if you want to avoid holes being reported to > > fiemap, then add a BMV_IF_NO_HOLES flag to xfs_getbmap() and skip > > holes in the mappin gloop when this flag is set. That will make > > fiemap fill in the full number of extents without hacking the > > extent count... > Here is the updated one. I have used BVM_IF_NO_HOLES in xfs_getbmap > to skip increasing index 'cur_ext'. It is a bit ugly, see my commit > log. I guess maybe we can add another flag in xfs_bmapi so that it > don't even give us the holes? No need... > > Regards, > Tao > > From cee1765ffd3e2b003b837666b4620b5107ed9ddd Mon Sep 17 00:00:00 2001 > From: Tao Ma > Date: Thu, 17 Jun 2010 16:14:22 +0800 > Subject: [PATCH v3] xfs: Make fiemap works with sparse file. > > 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. > > This patch add a new parameter BMV_IF_NO_HOLES for bvm_iflags. > So with this flags, we don't use our 'out' in xfs_getbmap for > a hole. The solution is a bit ugly by just don't increasing > index of 'out' vector. I felt that it is not easy to skip it > at the very beginning since we have the complicated check and > some function like xfs_getbmapx_fix_eof_hole to adjust 'out'. ... because I think we can safely skip xfs_getbmapx_fix_eof_hole() it only modifies the hole. Hence just adding a check after the attribute fork end check (which needs to detect a hole to terminate) should be fine: e.g something like: if (map[i].br_startblock == HOLESTARTBLOCK && whichfork == XFS_ATTR_FORK) { /* came to the end of attribute fork */ out[cur_ext].bmv_oflags |= BMV_OF_LAST; goto out_free_map; } + if (map[i].br_startblock == HOLESTARTBLOCK && + (iflags & BMV_IF_NO_HOLES)) { + memset(&out[cur_ext], 0, sizeof(out[cur_ext])); + continue; + } Should work and avoid the worst of the ugliness. The rest of the patch looks fine. Cheers, Dave. -- Dave Chinner david@fromorbit.com From tao.ma@oracle.com Thu Jun 17 21:26:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5I2QC2Z201775 for ; Thu, 17 Jun 2010 21:26:13 -0500 X-ASG-Debug-ID: 1276828357-556903870000-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 E353DB19EEF for ; Thu, 17 Jun 2010 19:32:37 -0700 (PDT) Received: from rcsinet10.oracle.com (rcsinet10.oracle.com [148.87.113.121]) by cuda.sgi.com with ESMTP id nmbZTZsCU0On2GO4 for ; Thu, 17 Jun 2010 19:32:37 -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 o5I2SZPT020931 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 18 Jun 2010 02:28:37 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 o5HKAFJV015495; Fri, 18 Jun 2010 02:28:34 GMT Received: from abhmt005.oracle.com by acsmt355.oracle.com with ESMTP id 336850721276828073; Thu, 17 Jun 2010 19:27:53 -0700 Received: from [10.182.120.191] (/10.182.120.191) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 17 Jun 2010 19:27:52 -0700 Message-ID: <4C1AD9A5.8010600@oracle.com> Date: Fri, 18 Jun 2010 10:27:49 +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, Alex Elder , Christoph Hellwig , Eric Sandeen , "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: <20100614122912.GD6590@dastard> <1276764799-4837-1-git-send-email-tao.ma@oracle.com> <20100618004708.GZ6590@dastard> In-Reply-To: <20100618004708.GZ6590@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Auth-Type: Internal IP X-Source-IP: acsinet15.oracle.com [141.146.126.227] X-CT-RefId: str=0001.0A090209.4C1AD9D6.0099:SCFMA922111,ss=1,fgs=0 X-Barracuda-Connect: rcsinet10.oracle.com[148.87.113.121] X-Barracuda-Start-Time: 1276828357 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32825 Rule breakdown below pts rule 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, On 06/18/2010 08:47 AM, Dave Chinner wrote: > On Thu, Jun 17, 2010 at 04:53:19PM +0800, Tao Ma wrote: >> Hi Dave, >> On 06/14/2010 08:29 PM, Dave Chinner wrote: >>> I just had a thought - if you want to avoid holes being reported to >>> fiemap, then add a BMV_IF_NO_HOLES flag to xfs_getbmap() and skip >>> holes in the mappin gloop when this flag is set. That will make >>> fiemap fill in the full number of extents without hacking the >>> extent count... >> Here is the updated one. I have used BVM_IF_NO_HOLES in xfs_getbmap >> to skip increasing index 'cur_ext'. It is a bit ugly, see my commit >> log. I guess maybe we can add another flag in xfs_bmapi so that it >> don't even give us the holes? > > No need... I am fine with it. > >> >> Regards, >> Tao >> >> From cee1765ffd3e2b003b837666b4620b5107ed9ddd Mon Sep 17 00:00:00 2001 >> From: Tao Ma >> Date: Thu, 17 Jun 2010 16:14:22 +0800 >> Subject: [PATCH v3] xfs: Make fiemap works with sparse file. >> >> 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. >> >> This patch add a new parameter BMV_IF_NO_HOLES for bvm_iflags. >> So with this flags, we don't use our 'out' in xfs_getbmap for >> a hole. The solution is a bit ugly by just don't increasing >> index of 'out' vector. I felt that it is not easy to skip it >> at the very beginning since we have the complicated check and >> some function like xfs_getbmapx_fix_eof_hole to adjust 'out'. > > ... because I think we can safely skip xfs_getbmapx_fix_eof_hole() > it only modifies the hole. Hence just adding a check after the > attribute fork end check (which needs to detect a hole to terminate) > should be fine: e.g something like: > > if (map[i].br_startblock == HOLESTARTBLOCK&& > whichfork == XFS_ATTR_FORK) { > /* came to the end of attribute fork */ > out[cur_ext].bmv_oflags |= BMV_OF_LAST; > goto out_free_map; > } > + if (map[i].br_startblock == HOLESTARTBLOCK&& > + (iflags& BMV_IF_NO_HOLES)) { > + memset(&out[cur_ext], 0, sizeof(out[cur_ext])); > + continue; > + } > > Should work and avoid the worst of the ugliness. I am afraid it doesn't work, at least from my test. It enters a dead loop. I think the root cause is that your change doesn't update bmv_offset and bmv_length for a hole. So in the large loop, do { nmap = (nexleft > subnex) ? subnex : nexleft; error = xfs_bmapi(NULL, ip, XFS_BB_TO_FSBT(mp, bmv->bmv_offset), XFS_BB_TO_FSB(mp, bmv->bmv_length), bmapi_flags, NULL, 0, map, &nmap, NULL, NULL); if (error) goto out_free_map; ... } while (nmap && nexleft && bmv->bmv_length); We will dead loop there and we need xfs_getbmapx_fix_eof_hole to go out directly. Regards, Tao From SRS0+HoFB+18+fromorbit.com=david@internode.on.net Fri Jun 18 01:20:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5I6KJAM211085 for ; Fri, 18 Jun 2010 01:20:19 -0500 X-ASG-Debug-ID: 1276842175-6e9002a10000-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 871413E2E66 for ; Thu, 17 Jun 2010 23:22:56 -0700 (PDT) Received: from mail.internode.on.net (bld-mail12.adl6.internode.on.net [150.101.137.97]) by cuda.sgi.com with ESMTP id L5nQGFa5lXbxtIOZ for ; Thu, 17 Jun 2010 23:22:56 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28385885-1927428 for multiple; Fri, 18 Jun 2010 15:52:27 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OPUy9-0007zH-PZ; Fri, 18 Jun 2010 16:22:25 +1000 Date: Fri, 18 Jun 2010 16:22:25 +1000 From: Dave Chinner To: Tao Ma Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Alex Elder , Christoph Hellwig , Eric Sandeen 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: <20100618062225.GC6590@dastard> References: <20100614122912.GD6590@dastard> <1276764799-4837-1-git-send-email-tao.ma@oracle.com> <20100618004708.GZ6590@dastard> <4C1AD9A5.8010600@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C1AD9A5.8010600@oracle.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1276842177 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32842 Rule breakdown below pts rule 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 18, 2010 at 10:27:49AM +0800, Tao Ma wrote: > >>This patch add a new parameter BMV_IF_NO_HOLES for bvm_iflags. > >>So with this flags, we don't use our 'out' in xfs_getbmap for > >>a hole. The solution is a bit ugly by just don't increasing > >>index of 'out' vector. I felt that it is not easy to skip it > >>at the very beginning since we have the complicated check and > >>some function like xfs_getbmapx_fix_eof_hole to adjust 'out'. > > > >... because I think we can safely skip xfs_getbmapx_fix_eof_hole() > >it only modifies the hole. Hence just adding a check after the > >attribute fork end check (which needs to detect a hole to terminate) > >should be fine: e.g something like: > > > > if (map[i].br_startblock == HOLESTARTBLOCK&& > > whichfork == XFS_ATTR_FORK) { > > /* came to the end of attribute fork */ > > out[cur_ext].bmv_oflags |= BMV_OF_LAST; > > goto out_free_map; > > } > >+ if (map[i].br_startblock == HOLESTARTBLOCK&& > >+ (iflags& BMV_IF_NO_HOLES)) { > >+ memset(&out[cur_ext], 0, sizeof(out[cur_ext])); > >+ continue; > >+ } > > > >Should work and avoid the worst of the ugliness. > I am afraid it doesn't work, at least from my test. It enters a dead loop. > I think the root cause is that your change doesn't update bmv_offset > and bmv_length for a hole. So in the large loop, Yes, you are right - I didn't consider the outer loop termination properly. My bad. I'll add your patch to my qa list and move it onwards. Thanks. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+AWmN+18+fromorbit.com=dave@internode.on.net Fri Jun 18 02:30: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 o5I7UoIX213375 for ; Fri, 18 Jun 2010 02:30:50 -0500 X-ASG-Debug-ID: 1276846406-51a700eb0000-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 035591B766DF for ; Fri, 18 Jun 2010 00:33:26 -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 D9RHGU4mFzMu44dB for ; Fri, 18 Jun 2010 00:33:26 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28493544-1927428 for multiple; Fri, 18 Jun 2010 17:03:22 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OPW4n-00083F-2o; Fri, 18 Jun 2010 17:33:21 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OPW4k-0006Ed-QI; Fri, 18 Jun 2010 17:33:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: security@kernel.org X-ASG-Orig-Subj: [PATCH 3/4] xfs: rename XFS_IGET_BULKSTAT to XFS_IGET_UNTRUSTED Subject: [PATCH 3/4] xfs: rename XFS_IGET_BULKSTAT to XFS_IGET_UNTRUSTED Date: Fri, 18 Jun 2010 17:32:53 +1000 Message-Id: <1276846374-23916-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1276846374-23916-1-git-send-email-david@fromorbit.com> References: <1276846374-23916-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1276846408 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32846 Rule breakdown below pts rule 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 Inode numbers may come from somewhere external to the filesystem (e.g. file handles, bulkstat information) and so are inherently untrusted. Rename the flag we use for these lookups to make it obvious we are doing a lookup of an untrusted inode number and need to verify it completely before trying to read it from disk. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_export.c | 9 ++++----- fs/xfs/xfs_ialloc.c | 6 +++--- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_itable.c | 2 +- 5 files changed, 10 insertions(+), 11 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_export.c b/fs/xfs/linux-2.6/xfs_export.c index e61232f..b39c05c 100644 --- a/fs/xfs/linux-2.6/xfs_export.c +++ b/fs/xfs/linux-2.6/xfs_export.c @@ -127,12 +127,11 @@ xfs_nfs_get_inode( return ERR_PTR(-ESTALE); /* - * The XFS_IGET_BULKSTAT means that an invalid inode number is just - * fine and not an indication of a corrupted filesystem. Because - * clients can send any kind of invalid file handle, e.g. after - * a restore on the server we have to deal with this case gracefully. + * The XFS_IGET_UNTRUSTED means that an invalid inode number is just + * fine and not an indication of a corrupted filesystem as clients can + * send invalid file handles and we have to handle it gracefully.. */ - error = xfs_iget(mp, NULL, ino, XFS_IGET_BULKSTAT, + error = xfs_iget(mp, NULL, ino, XFS_IGET_UNTRUSTED, XFS_ILOCK_SHARED, &ip, 0); if (error) { /* diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 06eb987..4efc23b 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -1265,7 +1265,7 @@ error0: return error; /* for untrusted inodes check it is allocated first */ - if ((flags & XFS_IGET_BULKSTAT) && + if ((flags & XFS_IGET_UNTRUSTED) && (rec.ir_free & XFS_INOBT_MASK(agino - rec.ir_startino))) return EINVAL; @@ -1307,7 +1307,7 @@ xfs_imap( ino != XFS_AGINO_TO_INO(mp, agno, agino)) { #ifdef DEBUG /* no diagnostics for bulkstat, ino comes from userspace */ - if (flags & XFS_IGET_BULKSTAT) + if (flags & XFS_IGET_UNTRUSTED) return XFS_ERROR(EINVAL); if (agno >= mp->m_sb.sb_agcount) { xfs_fs_cmn_err(CE_ALERT, mp, @@ -1343,7 +1343,7 @@ xfs_imap( * inodes in stale state on disk. Hence we have to do a btree lookup * in all cases where an untrusted inode number is passed. */ - if (flags & XFS_IGET_BULKSTAT) { + if (flags & XFS_IGET_UNTRUSTED) { error = xfs_imap_lookup(mp, tp, agno, agino, agbno, &chunk_agbno, &offset_agbno, flags); if (error) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 5c2ada4..9101e79 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -173,7 +173,7 @@ xfs_imap_to_bp( if (unlikely(XFS_TEST_ERROR(!di_ok, mp, XFS_ERRTAG_ITOBP_INOTOBP, XFS_RANDOM_ITOBP_INOTOBP))) { - if (iget_flags & XFS_IGET_BULKSTAT) { + if (iget_flags & XFS_IGET_UNTRUSTED) { xfs_trans_brelse(tp, bp); return XFS_ERROR(EINVAL); } diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 10dd2e0..7a2f347 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -499,7 +499,7 @@ do { \ * Flags for xfs_iget() */ #define XFS_IGET_CREATE 0x1 -#define XFS_IGET_BULKSTAT 0x2 +#define XFS_IGET_UNTRUSTED 0x2 int xfs_inotobp(struct xfs_mount *, struct xfs_trans *, xfs_ino_t, struct xfs_dinode **, diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index f554bd9..5fccd84 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -76,7 +76,7 @@ xfs_bulkstat_one_int( return XFS_ERROR(ENOMEM); error = xfs_iget(mp, NULL, ino, - XFS_IGET_BULKSTAT, XFS_ILOCK_SHARED, &ip, bno); + XFS_IGET_UNTRUSTED, XFS_ILOCK_SHARED, &ip, bno); if (error) { *stat = BULKSTAT_RV_NOTHING; goto out_free; -- 1.7.1 From SRS0+AWmN+18+fromorbit.com=dave@internode.on.net Fri Jun 18 02:30:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=BAYES_00,LOCALPART_IN_SUBJECT 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 o5I7Uw6x213398 for ; Fri, 18 Jun 2010 02:30:58 -0500 X-ASG-Debug-ID: 1276846642-41c503530000-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 ED981B1DD80 for ; Fri, 18 Jun 2010 00:37:23 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id K6PzAHFh5HAD7kou for ; Fri, 18 Jun 2010 00:37:23 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28493559-1927428 for multiple; Fri, 18 Jun 2010 17:03:32 +0930 (CST) Received: from [192.168.1.9] (helo=disturbed) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OPW4w-00083C-Pc; Fri, 18 Jun 2010 17:33:30 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OPW4k-0006EW-I3; Fri, 18 Jun 2010 17:33:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: security@kernel.org X-ASG-Orig-Subj: xfs: validate inode numbers in file handles correctly Subject: xfs: validate inode numbers in file handles correctly Date: Fri, 18 Jun 2010 17:32:50 +1000 Message-Id: <1276846374-23916-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1276846644 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.02 X-Barracuda-Spam-Status: No, SCORE=-1.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=LOCALPART_IN_SUBJECT, LOCALPART_IN_SUBJECT_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32847 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 LOCALPART_IN_SUBJECT Local part of To: address appears in Subject 1.00 LOCALPART_IN_SUBJECT_2 Local part of To: address appears in Subject X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This series closes a recently discovered problem in XFS filehandle conversion. On systems where inodes are dynamically deleted, XFS does not adequately verify the inode numbers in the filehandles, which results in reading stale inodes from disk and potentially returning them as valid files. Because these unlinked inodes were never zeroed out when the chunk was deallocated, some inodes in the chunk can still appear to have to data extents attached to them. This can lead to stale data exposure, exposure of active data and potentially overwriting of active data if the stale extents referenced in the unlinked inodes have been re-allocated. Both NFS filehandles and local filehandles provided through libhandle have this same problem. libhandle requires root permissions to use the interface, so it is not exposing information that you can't get more easily with other means (e.g. xfs_db or reading directly form the block device), so there isn't really an issue here. For NFS, we may incorrectly accept stale file handles for unlinked inodes after a server reboot if the unlinked inodes have not been overwritten leading to the above issues being triggered if multiple NFS clients are accessing the some files. Christoph's make-bulkstat-coherent patch is the basis for this series as bulkstat can also expose unlinked inodes and information about them back to userspace because it makes the same assumptions about inode lookups as the file handle interfaces. As a result, the first two patches of the series make up the real bug fix. The last two patches make it clear we are looking up untrusted inode numbers and remove a shortcut that these interfaces used that we do not want used any more. Hence for backports to other kernels, only the first two patches are necessary. More information and the test program that demonstrates the issue via the open_by_handle interface can be found here: http://oss.sgi.com/archives/xfs/2010-06/msg00191.html From SRS0+dQqb+18+fromorbit.com=dave@internode.on.net Fri Jun 18 02:31: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_65 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5I7V0xa213408 for ; Fri, 18 Jun 2010 02:31:00 -0500 X-ASG-Debug-ID: 1276846416-3c8000c10000-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 D87323E3E48 for ; Fri, 18 Jun 2010 00:33:36 -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 8aHKSlaQCeJUx2An for ; Fri, 18 Jun 2010 00:33:36 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28345897-1927428 for multiple; Fri, 18 Jun 2010 17:03:32 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OPW4n-00083E-0h; Fri, 18 Jun 2010 17:33:21 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OPW4k-0006Ea-NO; Fri, 18 Jun 2010 17:33:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: security@kernel.org X-ASG-Orig-Subj: [PATCH 2/4] xfs: validate untrusted inode numbers during lookup Subject: [PATCH 2/4] xfs: validate untrusted inode numbers during lookup Date: Fri, 18 Jun 2010 17:32:52 +1000 Message-Id: <1276846374-23916-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1276846374-23916-1-git-send-email-david@fromorbit.com> References: <1276846374-23916-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1276846417 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32846 Rule breakdown below pts rule 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 When we decode a handle or do a bulkstat lookup, we are using an inode number we cannot trust to be valid. If we are deleting inode chunks from disk (default noikeep mode), then we cannot trust the on disk inode buffer for any given inode number to correctly reflect whether the inode has been unlinked as the di_mode nor the generation number may have been updated on disk. This is due to the fact that when we delete an inode chunk, we do not write the clusters back to disk when they are removed - instead we mark them stale to avoid them being written back potentially over the top of something that has been subsequently allocated at that location. The result is that we can have locations of disk that look like they contain valid inodes but in reality do not. Hence we cannot simply convert the inode number to a block number and read the location from disk to determine if the inode is valid or not. As a result, and XFS_IGET_BULKSTAT lookup needs to actually look the inode up in the inode allocation btree to determine if the inode number is valid or not. It should be noted even on ikeep filesystems, there is the possibility that blocks on disk may look like valid inode clusters. e.g. if there are filesystem images hosted on the filesystem. Hence even for ikeep filesystems we really need to validate that the inode number is valid before issuing the inode buffer read. Signed-off-by: Dave Chinner --- fs/xfs/xfs_ialloc.c | 139 +++++++++++++++++++++++++++++++++++---------------- 1 files changed, 96 insertions(+), 43 deletions(-) diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 0cf49f0..06eb987 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -1199,6 +1199,81 @@ error0: return error; } +static int +xfs_imap_lookup( + xfs_mount_t *mp, + xfs_trans_t *tp, + xfs_agnumber_t agno, + xfs_agino_t agino, + xfs_agblock_t agbno, + xfs_agblock_t *chunk_agbno, + xfs_agblock_t *offset_agbno, + int flags) +{ + xfs_inobt_rec_incore_t rec; + xfs_btree_cur_t *cur; + xfs_buf_t *agbp; + int error; + int i; + xfs_agino_t startino; + + error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); + if (error) { + xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " + "xfs_ialloc_read_agi() returned " + "error %d, agno %d", + error, agno); + return error; + } + + /* + * derive and lookup the exact inode record for the given agino. If the + * record cannot be found, then it's an invalid inode number and we + * should abort. + */ + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); + startino = agino & ~(XFS_IALLOC_INODES(mp) - 1); + error = xfs_inobt_lookup(cur, startino, XFS_LOOKUP_EQ, &i); + if (error) { + xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " + "xfs_inobt_lookup() failed"); + goto error0; + } + if (i == 0) { + error = EINVAL; + goto error0; + } + + error = xfs_inobt_get_rec(cur, &rec, &i); + if (error) { + xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " + "xfs_inobt_get_rec() failed"); + goto error0; + } + if (i == 0) { +#ifdef DEBUG + xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " + "xfs_inobt_get_rec() failed"); +#endif /* DEBUG */ + error = XFS_ERROR(EINVAL); + } +error0: + xfs_trans_brelse(tp, agbp); + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + + if (error) + return error; + + /* for untrusted inodes check it is allocated first */ + if ((flags & XFS_IGET_BULKSTAT) && + (rec.ir_free & XFS_INOBT_MASK(agino - rec.ir_startino))) + return EINVAL; + + *chunk_agbno = XFS_AGINO_TO_AGBNO(mp, rec.ir_startino); + *offset_agbno = agbno - *chunk_agbno; + return 0; +} + /* * Return the location of the inode in imap, for mapping it into a buffer. */ @@ -1259,6 +1334,23 @@ xfs_imap( return XFS_ERROR(EINVAL); } + blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_blocklog; + + /* + * For bulkstat and handle lookups, we have an untrusted inode number + * that we have to verify is valid. We cannot do this just by reading + * the inode buffer as it may have been unlinked and removed leaving + * inodes in stale state on disk. Hence we have to do a btree lookup + * in all cases where an untrusted inode number is passed. + */ + if (flags & XFS_IGET_BULKSTAT) { + error = xfs_imap_lookup(mp, tp, agno, agino, agbno, + &chunk_agbno, &offset_agbno, flags); + if (error) + return error; + goto out_map; + } + /* * If the inode cluster size is the same as the blocksize or * smaller we get to the buffer by simple arithmetics. @@ -1273,10 +1365,8 @@ xfs_imap( return 0; } - blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_blocklog; - /* - * If we get a block number passed from bulkstat we can use it to + * If we get a block number passed we can use it to * find the buffer easily. */ if (imap->im_blkno) { @@ -1300,50 +1390,13 @@ xfs_imap( offset_agbno = agbno & mp->m_inoalign_mask; chunk_agbno = agbno - offset_agbno; } else { - xfs_btree_cur_t *cur; /* inode btree cursor */ - xfs_inobt_rec_incore_t chunk_rec; - xfs_buf_t *agbp; /* agi buffer */ - int i; /* temp state */ - - error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); - if (error) { - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " - "xfs_ialloc_read_agi() returned " - "error %d, agno %d", - error, agno); - return error; - } - - cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); - error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &i); - if (error) { - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " - "xfs_inobt_lookup() failed"); - goto error0; - } - - error = xfs_inobt_get_rec(cur, &chunk_rec, &i); - if (error) { - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " - "xfs_inobt_get_rec() failed"); - goto error0; - } - if (i == 0) { -#ifdef DEBUG - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " - "xfs_inobt_get_rec() failed"); -#endif /* DEBUG */ - error = XFS_ERROR(EINVAL); - } - error0: - xfs_trans_brelse(tp, agbp); - xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + error = xfs_imap_lookup(mp, tp, agno, agino, agbno, + &chunk_agbno, &offset_agbno, flags); if (error) return error; - chunk_agbno = XFS_AGINO_TO_AGBNO(mp, chunk_rec.ir_startino); - offset_agbno = agbno - chunk_agbno; } +out_map: ASSERT(agbno >= chunk_agbno); cluster_agbno = chunk_agbno + ((offset_agbno / blks_per_cluster) * blks_per_cluster); -- 1.7.1 From SRS0+HiFe+18+fromorbit.com=dave@internode.on.net Fri Jun 18 02:31: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.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_63, J_CHICKENPOX_66,J_CHICKENPOX_92 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5I7V0Ij213416 for ; Fri, 18 Jun 2010 02:31:00 -0500 X-ASG-Debug-ID: 1276846416-51a2013c0000-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 2E7B81B766E1 for ; Fri, 18 Jun 2010 00:33:36 -0700 (PDT) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id 9xrk57bWTK9AIWi0 for ; Fri, 18 Jun 2010 00:33:36 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28250851-1927428 for multiple; Fri, 18 Jun 2010 17:03:33 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OPW4n-00083I-5j; Fri, 18 Jun 2010 17:33:21 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OPW4k-0006Ef-SF; Fri, 18 Jun 2010 17:33:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: security@kernel.org X-ASG-Orig-Subj: [PATCH 4/4] xfs: remove block number from inode lookup code Subject: [PATCH 4/4] xfs: remove block number from inode lookup code Date: Fri, 18 Jun 2010 17:32:54 +1000 Message-Id: <1276846374-23916-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1276846374-23916-1-git-send-email-david@fromorbit.com> References: <1276846374-23916-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1276846418 X-Barracuda-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.32846 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The block number comes from bulkstat based inode lookups to shortcut the mapping calculations. We ar enot able to trust anything from bulkstat, so drop the block number as well so that the correct lookups and mappings are always done. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_export.c | 2 +- fs/xfs/linux-2.6/xfs_ioctl32.c | 5 ++--- fs/xfs/quota/xfs_qm.c | 7 +++---- fs/xfs/quota/xfs_qm_syscalls.c | 11 +++++------ fs/xfs/xfs_ialloc.c | 16 ---------------- fs/xfs/xfs_iget.c | 10 +++------- fs/xfs/xfs_inode.c | 4 +--- fs/xfs/xfs_inode.h | 4 ++-- fs/xfs/xfs_itable.c | 12 ++++-------- fs/xfs/xfs_itable.h | 3 --- fs/xfs/xfs_log_recover.c | 2 +- fs/xfs/xfs_mount.c | 2 +- fs/xfs/xfs_rtalloc.c | 4 ++-- fs/xfs/xfs_trans_inode.c | 2 +- fs/xfs/xfs_vnodeops.c | 2 +- 15 files changed, 27 insertions(+), 59 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_export.c b/fs/xfs/linux-2.6/xfs_export.c index b39c05c..55df942 100644 --- a/fs/xfs/linux-2.6/xfs_export.c +++ b/fs/xfs/linux-2.6/xfs_export.c @@ -132,7 +132,7 @@ xfs_nfs_get_inode( * send invalid file handles and we have to handle it gracefully.. */ error = xfs_iget(mp, NULL, ino, XFS_IGET_UNTRUSTED, - XFS_ILOCK_SHARED, &ip, 0); + XFS_ILOCK_SHARED, &ip); if (error) { /* * EINVAL means the inode cluster doesn't exist anymore. diff --git a/fs/xfs/linux-2.6/xfs_ioctl32.c b/fs/xfs/linux-2.6/xfs_ioctl32.c index 48c1aba..6cd1225 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl32.c +++ b/fs/xfs/linux-2.6/xfs_ioctl32.c @@ -233,12 +233,11 @@ xfs_bulkstat_one_compat( xfs_ino_t ino, /* inode number to get data for */ void __user *buffer, /* buffer to place output in */ int ubsize, /* size of buffer */ - xfs_daddr_t bno, /* starting bno of inode cluster */ int *ubused, /* bytes used by me */ int *stat) /* BULKSTAT_RV_... */ { return xfs_bulkstat_one_int(mp, ino, buffer, ubsize, - xfs_bulkstat_one_fmt_compat, bno, + xfs_bulkstat_one_fmt_compat, ubused, stat); } @@ -292,7 +291,7 @@ xfs_compat_ioc_bulkstat( int res; error = xfs_bulkstat_one_compat(mp, inlast, bulkreq.ubuffer, - sizeof(compat_xfs_bstat_t), 0, NULL, &res); + sizeof(compat_xfs_bstat_t), 0, &res); } else if (cmd == XFS_IOC_FSBULKSTAT_32) { error = xfs_bulkstat(mp, &inlast, &count, xfs_bulkstat_one_compat, sizeof(compat_xfs_bstat_t), diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index 25bc7da..175032f 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c @@ -1625,7 +1625,6 @@ xfs_qm_dqusage_adjust( xfs_ino_t ino, /* inode number to get data for */ void __user *buffer, /* not used */ int ubsize, /* not used */ - xfs_daddr_t bno, /* starting block of inode cluster */ int *ubused, /* not used */ int *res) /* result code value */ { @@ -1651,7 +1650,7 @@ xfs_qm_dqusage_adjust( * the case in all other instances. It's OK that we do this because * quotacheck is done only at mount time. */ - if ((error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_EXCL, &ip, bno))) { + if ((error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_EXCL, &ip))) { *res = BULKSTAT_RV_NOTHING; return error; } @@ -1881,14 +1880,14 @@ xfs_qm_init_quotainos( mp->m_sb.sb_uquotino != NULLFSINO) { ASSERT(mp->m_sb.sb_uquotino > 0); if ((error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, - 0, 0, &uip, 0))) + 0, 0, &uip))) return XFS_ERROR(error); } if (XFS_IS_OQUOTA_ON(mp) && mp->m_sb.sb_gquotino != NULLFSINO) { ASSERT(mp->m_sb.sb_gquotino > 0); if ((error = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, - 0, 0, &gip, 0))) { + 0, 0, &gip))) { if (uip) IRELE(uip); return XFS_ERROR(error); diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index aa44c58..2d1abbf 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c @@ -252,7 +252,7 @@ xfs_qm_scall_trunc_qfiles( } if ((flags & XFS_DQ_USER) && mp->m_sb.sb_uquotino != NULLFSINO) { - error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, 0, 0, &qip, 0); + error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, 0, 0, &qip); if (!error) { error = xfs_truncate_file(mp, qip); IRELE(qip); @@ -261,7 +261,7 @@ xfs_qm_scall_trunc_qfiles( if ((flags & (XFS_DQ_GROUP|XFS_DQ_PROJ)) && mp->m_sb.sb_gquotino != NULLFSINO) { - error2 = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, 0, 0, &qip, 0); + error2 = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, 0, 0, &qip); if (!error2) { error2 = xfs_truncate_file(mp, qip); IRELE(qip); @@ -407,12 +407,12 @@ xfs_qm_scall_getqstat( } if (!uip && mp->m_sb.sb_uquotino != NULLFSINO) { if (xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, - 0, 0, &uip, 0) == 0) + 0, 0, &uip) == 0) tempuqip = B_TRUE; } if (!gip && mp->m_sb.sb_gquotino != NULLFSINO) { if (xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, - 0, 0, &gip, 0) == 0) + 0, 0, &gip) == 0) tempgqip = B_TRUE; } if (uip) { @@ -1095,7 +1095,6 @@ xfs_qm_internalqcheck_adjust( xfs_ino_t ino, /* inode number to get data for */ void __user *buffer, /* not used */ int ubsize, /* not used */ - xfs_daddr_t bno, /* starting block of inode cluster */ int *ubused, /* not used */ int *res) /* bulkstat result code */ { @@ -1118,7 +1117,7 @@ xfs_qm_internalqcheck_adjust( ipreleased = B_FALSE; again: lock_flags = XFS_ILOCK_SHARED; - if ((error = xfs_iget(mp, NULL, ino, 0, lock_flags, &ip, bno))) { + if ((error = xfs_iget(mp, NULL, ino, 0, lock_flags, &ip))) { *res = BULKSTAT_RV_NOTHING; return (error); } diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 4efc23b..b4351a7 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -1366,22 +1366,6 @@ xfs_imap( } /* - * If we get a block number passed we can use it to - * find the buffer easily. - */ - if (imap->im_blkno) { - offset = XFS_INO_TO_OFFSET(mp, ino); - ASSERT(offset < mp->m_sb.sb_inopblock); - - cluster_agbno = xfs_daddr_to_agbno(mp, imap->im_blkno); - offset += (agbno - cluster_agbno) * mp->m_sb.sb_inopblock; - - imap->im_len = XFS_FSB_TO_BB(mp, blks_per_cluster); - imap->im_boffset = (ushort)(offset << mp->m_sb.sb_inodelog); - return 0; - } - - /* * If the inode chunks are aligned then use simple maths to * find the location. Otherwise we have to do a btree * lookup to find the location. diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index a80b9b9..d6ef971 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c @@ -255,7 +255,6 @@ xfs_iget_cache_miss( xfs_trans_t *tp, xfs_ino_t ino, struct xfs_inode **ipp, - xfs_daddr_t bno, int flags, int lock_flags) { @@ -268,7 +267,7 @@ xfs_iget_cache_miss( if (!ip) return ENOMEM; - error = xfs_iread(mp, tp, ip, bno, flags); + error = xfs_iread(mp, tp, ip, flags); if (error) goto out_destroy; @@ -354,8 +353,6 @@ out_destroy: * within the file system for the inode being requested. * lock_flags -- flags indicating how to lock the inode. See the comment * for xfs_ilock() for a list of valid values. - * bno -- the block number starting the buffer containing the inode, - * if known (as by bulkstat), else 0. */ int xfs_iget( @@ -364,8 +361,7 @@ xfs_iget( xfs_ino_t ino, uint flags, uint lock_flags, - xfs_inode_t **ipp, - xfs_daddr_t bno) + xfs_inode_t **ipp) { xfs_inode_t *ip; int error; @@ -393,7 +389,7 @@ again: read_unlock(&pag->pag_ici_lock); XFS_STATS_INC(xs_ig_missed); - error = xfs_iget_cache_miss(mp, pag, tp, ino, &ip, bno, + error = xfs_iget_cache_miss(mp, pag, tp, ino, &ip, flags, lock_flags); if (error) goto out_error_or_again; diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 9101e79..d09bc53 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -783,7 +783,6 @@ xfs_iread( xfs_mount_t *mp, xfs_trans_t *tp, xfs_inode_t *ip, - xfs_daddr_t bno, uint iget_flags) { xfs_buf_t *bp; @@ -793,11 +792,10 @@ xfs_iread( /* * Fill in the location information in the in-core inode. */ - ip->i_imap.im_blkno = bno; + ip->i_imap.im_blkno = 0; error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, iget_flags); if (error) return error; - ASSERT(bno == 0 || bno == ip->i_imap.im_blkno); /* * Get pointers to the on-disk inode and the buffer containing it. diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 7a2f347..7a19d52 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -442,7 +442,7 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) * xfs_iget.c prototypes. */ int xfs_iget(struct xfs_mount *, struct xfs_trans *, xfs_ino_t, - uint, uint, xfs_inode_t **, xfs_daddr_t); + uint, uint, xfs_inode_t **); void xfs_iput(xfs_inode_t *, uint); void xfs_ilock(xfs_inode_t *, uint); int xfs_ilock_nowait(xfs_inode_t *, uint); @@ -508,7 +508,7 @@ int xfs_itobp(struct xfs_mount *, struct xfs_trans *, struct xfs_inode *, struct xfs_dinode **, struct xfs_buf **, uint); int xfs_iread(struct xfs_mount *, struct xfs_trans *, - struct xfs_inode *, xfs_daddr_t, uint); + struct xfs_inode *, uint); void xfs_dinode_to_disk(struct xfs_dinode *, struct xfs_icdinode *); void xfs_idestroy_fork(struct xfs_inode *, int); diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 5fccd84..200dc6f 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -56,7 +56,6 @@ xfs_bulkstat_one_int( void __user *buffer, /* buffer to place output in */ int ubsize, /* size of buffer */ bulkstat_one_fmt_pf formatter, /* formatter, copy to user */ - xfs_daddr_t bno, /* starting bno of cluster */ int *ubused, /* bytes used by me */ int *stat) /* BULKSTAT_RV_... */ { @@ -76,7 +75,7 @@ xfs_bulkstat_one_int( return XFS_ERROR(ENOMEM); error = xfs_iget(mp, NULL, ino, - XFS_IGET_UNTRUSTED, XFS_ILOCK_SHARED, &ip, bno); + XFS_IGET_UNTRUSTED, XFS_ILOCK_SHARED, &ip); if (error) { *stat = BULKSTAT_RV_NOTHING; goto out_free; @@ -175,13 +174,11 @@ xfs_bulkstat_one( xfs_ino_t ino, /* inode number to get data for */ void __user *buffer, /* buffer to place output in */ int ubsize, /* size of buffer */ - xfs_daddr_t bno, /* starting bno of inode cluster */ int *ubused, /* bytes used by me */ int *stat) /* BULKSTAT_RV_... */ { return xfs_bulkstat_one_int(mp, ino, buffer, ubsize, - xfs_bulkstat_one_fmt, bno, - ubused, stat); + xfs_bulkstat_one_fmt, ubused, stat); } #define XFS_BULKSTAT_UBLEFT(ubleft) ((ubleft) >= statstruct_size) @@ -481,7 +478,7 @@ xfs_bulkstat( * Get the inode and fill in a single buffer. */ ubused = statstruct_size; - error = formatter(mp, ino, ubufp, ubleft, bno, + error = formatter(mp, ino, ubufp, ubleft, &ubused, &fmterror); if (fmterror == BULKSTAT_RV_NOTHING) { if (error && error != ENOENT && @@ -574,8 +571,7 @@ xfs_bulkstat_single( */ ino = (xfs_ino_t)*lastinop; - error = xfs_bulkstat_one(mp, ino, buffer, sizeof(xfs_bstat_t), - 0, NULL, &res); + error = xfs_bulkstat_one(mp, ino, buffer, sizeof(xfs_bstat_t), 0, &res); if (error) { /* * Special case way failed, do it the "long" way diff --git a/fs/xfs/xfs_itable.h b/fs/xfs/xfs_itable.h index fea0339..97295d9 100644 --- a/fs/xfs/xfs_itable.h +++ b/fs/xfs/xfs_itable.h @@ -27,7 +27,6 @@ typedef int (*bulkstat_one_pf)(struct xfs_mount *mp, xfs_ino_t ino, void __user *buffer, int ubsize, - xfs_daddr_t bno, int *ubused, int *stat); @@ -71,7 +70,6 @@ xfs_bulkstat_one_int( void __user *buffer, int ubsize, bulkstat_one_fmt_pf formatter, - xfs_daddr_t bno, int *ubused, int *stat); @@ -81,7 +79,6 @@ xfs_bulkstat_one( xfs_ino_t ino, void __user *buffer, int ubsize, - xfs_daddr_t bno, int *ubused, int *stat); diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 1ac0b79..6f3f5fa 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3186,7 +3186,7 @@ xlog_recover_process_one_iunlink( int error; ino = XFS_AGINO_TO_INO(mp, agno, agino); - error = xfs_iget(mp, NULL, ino, 0, 0, &ip, 0); + error = xfs_iget(mp, NULL, ino, 0, 0, &ip); if (error) goto fail; diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 4e1725b..aeb9d72 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1297,7 +1297,7 @@ xfs_mountfs( * Get and sanity-check the root inode. * Save the pointer to it in the mount structure. */ - error = xfs_iget(mp, NULL, sbp->sb_rootino, 0, XFS_ILOCK_EXCL, &rip, 0); + error = xfs_iget(mp, NULL, sbp->sb_rootino, 0, XFS_ILOCK_EXCL, &rip); if (error) { cmn_err(CE_WARN, "XFS: failed to read root inode"); goto out_log_dealloc; diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 20b5eb7..891260f 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -2270,12 +2270,12 @@ xfs_rtmount_inodes( sbp = &mp->m_sb; if (sbp->sb_rbmino == NULLFSINO) return 0; - error = xfs_iget(mp, NULL, sbp->sb_rbmino, 0, 0, &mp->m_rbmip, 0); + error = xfs_iget(mp, NULL, sbp->sb_rbmino, 0, 0, &mp->m_rbmip); if (error) return error; ASSERT(mp->m_rbmip != NULL); ASSERT(sbp->sb_rsumino != NULLFSINO); - error = xfs_iget(mp, NULL, sbp->sb_rsumino, 0, 0, &mp->m_rsumip, 0); + error = xfs_iget(mp, NULL, sbp->sb_rsumino, 0, 0, &mp->m_rsumip); if (error) { IRELE(mp->m_rbmip); return error; diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c index 10534c2..cdc53a1 100644 --- a/fs/xfs/xfs_trans_inode.c +++ b/fs/xfs/xfs_trans_inode.c @@ -57,7 +57,7 @@ xfs_trans_iget( { int error; - error = xfs_iget(mp, tp, ino, flags, lock_flags, ipp, 0); + error = xfs_iget(mp, tp, ino, flags, lock_flags, ipp); if (!error && tp) { xfs_trans_ijoin(tp, *ipp); (*ipp)->i_itemp->ili_lock_flags = lock_flags; diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index df6d1b5..ad599cc 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -1233,7 +1233,7 @@ xfs_lookup( if (error) goto out; - error = xfs_iget(dp->i_mount, NULL, inum, 0, 0, ipp, 0); + error = xfs_iget(dp->i_mount, NULL, inum, 0, 0, ipp); if (error) goto out_free_name; -- 1.7.1 From SRS0+dQqb+18+fromorbit.com=dave@internode.on.net Fri Jun 18 02:31: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.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_62, J_CHICKENPOX_92 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5I7V0Om213419 for ; Fri, 18 Jun 2010 02:31:00 -0500 X-ASG-Debug-ID: 1276846415-3c7e00bb0000-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 EE9373E3E4B for ; Fri, 18 Jun 2010 00:33: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 WS18C9hmba8uZ9pb for ; Fri, 18 Jun 2010 00:33:36 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28674077-1927428 for multiple; Fri, 18 Jun 2010 17:03:32 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OPW4m-00083D-Ul; Fri, 18 Jun 2010 17:33:20 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OPW4k-0006EY-KM; Fri, 18 Jun 2010 17:33:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: security@kernel.org X-ASG-Orig-Subj: [PATCH 1/4] xfs: always use iget in bulkstat Subject: [PATCH 1/4] xfs: always use iget in bulkstat Date: Fri, 18 Jun 2010 17:32:51 +1000 Message-Id: <1276846374-23916-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1276846374-23916-1-git-send-email-david@fromorbit.com> References: <1276846374-23916-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1276846417 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32846 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Christoph Hellwig The non-coherent bulkstat versionsthat look directly at the inode buffers causes various problems with performance optimizations that make increased use of just logging inodes. This patch makes bulkstat always use iget, which should be fast enough for normal use with the radix-tree based inode cache introduced a while ago. Signed-off-by: Christoph Hellwig --- fs/xfs/linux-2.6/xfs_ioctl.c | 7 +- fs/xfs/linux-2.6/xfs_ioctl32.c | 12 +- fs/xfs/quota/xfs_qm.c | 11 +- fs/xfs/quota/xfs_qm_syscalls.c | 16 +-- fs/xfs/xfs_itable.c | 281 ++++++---------------------------------- fs/xfs/xfs_itable.h | 14 -- 6 files changed, 59 insertions(+), 282 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index faafd94..a12ddda 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c @@ -670,10 +670,9 @@ xfs_ioc_bulkstat( error = xfs_bulkstat_single(mp, &inlast, bulkreq.ubuffer, &done); else /* XFS_IOC_FSBULKSTAT */ - error = xfs_bulkstat(mp, &inlast, &count, - (bulkstat_one_pf)xfs_bulkstat_one, NULL, - sizeof(xfs_bstat_t), bulkreq.ubuffer, - BULKSTAT_FG_QUICK, &done); + error = xfs_bulkstat(mp, &inlast, &count, xfs_bulkstat_one, + sizeof(xfs_bstat_t), bulkreq.ubuffer, + &done); if (error) return -error; diff --git a/fs/xfs/linux-2.6/xfs_ioctl32.c b/fs/xfs/linux-2.6/xfs_ioctl32.c index 40118b6..48c1aba 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl32.c +++ b/fs/xfs/linux-2.6/xfs_ioctl32.c @@ -233,15 +233,13 @@ xfs_bulkstat_one_compat( xfs_ino_t ino, /* inode number to get data for */ void __user *buffer, /* buffer to place output in */ int ubsize, /* size of buffer */ - void *private_data, /* my private data */ xfs_daddr_t bno, /* starting bno of inode cluster */ int *ubused, /* bytes used by me */ - void *dibuff, /* on-disk inode buffer */ int *stat) /* BULKSTAT_RV_... */ { return xfs_bulkstat_one_int(mp, ino, buffer, ubsize, xfs_bulkstat_one_fmt_compat, bno, - ubused, dibuff, stat); + ubused, stat); } /* copied from xfs_ioctl.c */ @@ -294,13 +292,11 @@ xfs_compat_ioc_bulkstat( int res; error = xfs_bulkstat_one_compat(mp, inlast, bulkreq.ubuffer, - sizeof(compat_xfs_bstat_t), - NULL, 0, NULL, NULL, &res); + sizeof(compat_xfs_bstat_t), 0, NULL, &res); } else if (cmd == XFS_IOC_FSBULKSTAT_32) { error = xfs_bulkstat(mp, &inlast, &count, - xfs_bulkstat_one_compat, NULL, - sizeof(compat_xfs_bstat_t), bulkreq.ubuffer, - BULKSTAT_FG_QUICK, &done); + xfs_bulkstat_one_compat, sizeof(compat_xfs_bstat_t), + bulkreq.ubuffer, &done); } else error = XFS_ERROR(EINVAL); if (error) diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index 7a231ff..25bc7da 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c @@ -1625,10 +1625,8 @@ xfs_qm_dqusage_adjust( xfs_ino_t ino, /* inode number to get data for */ void __user *buffer, /* not used */ int ubsize, /* not used */ - void *private_data, /* not used */ xfs_daddr_t bno, /* starting block of inode cluster */ int *ubused, /* not used */ - void *dip, /* on-disk inode pointer (not used) */ int *res) /* result code value */ { xfs_inode_t *ip; @@ -1789,12 +1787,13 @@ xfs_qm_quotacheck( * Iterate thru all the inodes in the file system, * adjusting the corresponding dquot counters in core. */ - if ((error = xfs_bulkstat(mp, &lastino, &count, - xfs_qm_dqusage_adjust, NULL, - structsz, NULL, BULKSTAT_FG_IGET, &done))) + error = xfs_bulkstat(mp, &lastino, &count, + xfs_qm_dqusage_adjust, + structsz, NULL, &done); + if (error) break; - } while (! done); + } while (!done); /* * We've made all the changes that we need to make incore. diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index 19f218c..aa44c58 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c @@ -1095,10 +1095,8 @@ xfs_qm_internalqcheck_adjust( xfs_ino_t ino, /* inode number to get data for */ void __user *buffer, /* not used */ int ubsize, /* not used */ - void *private_data, /* not used */ xfs_daddr_t bno, /* starting block of inode cluster */ int *ubused, /* not used */ - void *dip, /* not used */ int *res) /* bulkstat result code */ { xfs_inode_t *ip; @@ -1191,15 +1189,15 @@ xfs_qm_internalqcheck( * Iterate thru all the inodes in the file system, * adjusting the corresponding dquot counters */ - if ((error = xfs_bulkstat(mp, &lastino, &count, - xfs_qm_internalqcheck_adjust, NULL, - 0, NULL, BULKSTAT_FG_IGET, &done))) { + error = xfs_bulkstat(mp, &lastino, &count, + xfs_qm_internalqcheck_adjust, + 0, NULL, &done); + if (error) { + cmn_err(CE_DEBUG, "Bulkstat returned error 0x%x", error); break; } - } while (! done); - if (error) { - cmn_err(CE_DEBUG, "Bulkstat returned error 0x%x", error); - } + } while (!done); + cmn_err(CE_DEBUG, "Checking results against system dquots"); for (i = 0; i < qmtest_hashmask; i++) { xfs_dqtest_t *d, *n; diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 8314386..f554bd9 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -45,24 +45,41 @@ xfs_internal_inum( (ino == mp->m_sb.sb_uquotino || ino == mp->m_sb.sb_gquotino))); } -STATIC int -xfs_bulkstat_one_iget( - xfs_mount_t *mp, /* mount point for filesystem */ - xfs_ino_t ino, /* inode number to get data for */ - xfs_daddr_t bno, /* starting bno of inode cluster */ - xfs_bstat_t *buf, /* return buffer */ - int *stat) /* BULKSTAT_RV_... */ +/* + * Return stat information for one inode. + * Return 0 if ok, else errno. + */ +int +xfs_bulkstat_one_int( + struct xfs_mount *mp, /* mount point for filesystem */ + xfs_ino_t ino, /* inode to get data for */ + void __user *buffer, /* buffer to place output in */ + int ubsize, /* size of buffer */ + bulkstat_one_fmt_pf formatter, /* formatter, copy to user */ + xfs_daddr_t bno, /* starting bno of cluster */ + int *ubused, /* bytes used by me */ + int *stat) /* BULKSTAT_RV_... */ { - xfs_icdinode_t *dic; /* dinode core info pointer */ - xfs_inode_t *ip; /* incore inode pointer */ - struct inode *inode; - int error; + struct xfs_icdinode *dic; /* dinode core info pointer */ + struct xfs_inode *ip; /* incore inode pointer */ + struct inode *inode; + struct xfs_bstat *buf; /* return buffer */ + int error = 0; /* error value */ + + *stat = BULKSTAT_RV_NOTHING; + + if (!buffer || xfs_internal_inum(mp, ino)) + return XFS_ERROR(EINVAL); + + buf = kmem_alloc(sizeof(*buf), KM_SLEEP | KM_MAYFAIL); + if (!buf) + return XFS_ERROR(ENOMEM); error = xfs_iget(mp, NULL, ino, XFS_IGET_BULKSTAT, XFS_ILOCK_SHARED, &ip, bno); if (error) { *stat = BULKSTAT_RV_NOTHING; - return error; + goto out_free; } ASSERT(ip != NULL); @@ -123,77 +140,16 @@ xfs_bulkstat_one_iget( buf->bs_blocks = dic->di_nblocks + ip->i_delayed_blks; break; } - xfs_iput(ip, XFS_ILOCK_SHARED); - return error; -} -STATIC void -xfs_bulkstat_one_dinode( - xfs_mount_t *mp, /* mount point for filesystem */ - xfs_ino_t ino, /* inode number to get data for */ - xfs_dinode_t *dic, /* dinode inode pointer */ - xfs_bstat_t *buf) /* return buffer */ -{ - /* - * The inode format changed when we moved the link count and - * made it 32 bits long. If this is an old format inode, - * convert it in memory to look like a new one. If it gets - * flushed to disk we will convert back before flushing or - * logging it. We zero out the new projid field and the old link - * count field. We'll handle clearing the pad field (the remains - * of the old uuid field) when we actually convert the inode to - * the new format. We don't change the version number so that we - * can distinguish this from a real new format inode. - */ - if (dic->di_version == 1) { - buf->bs_nlink = be16_to_cpu(dic->di_onlink); - buf->bs_projid = 0; - } else { - buf->bs_nlink = be32_to_cpu(dic->di_nlink); - buf->bs_projid = be16_to_cpu(dic->di_projid); - } + error = formatter(buffer, ubsize, ubused, buf); - buf->bs_ino = ino; - buf->bs_mode = be16_to_cpu(dic->di_mode); - buf->bs_uid = be32_to_cpu(dic->di_uid); - buf->bs_gid = be32_to_cpu(dic->di_gid); - buf->bs_size = be64_to_cpu(dic->di_size); - buf->bs_atime.tv_sec = be32_to_cpu(dic->di_atime.t_sec); - buf->bs_atime.tv_nsec = be32_to_cpu(dic->di_atime.t_nsec); - buf->bs_mtime.tv_sec = be32_to_cpu(dic->di_mtime.t_sec); - buf->bs_mtime.tv_nsec = be32_to_cpu(dic->di_mtime.t_nsec); - buf->bs_ctime.tv_sec = be32_to_cpu(dic->di_ctime.t_sec); - buf->bs_ctime.tv_nsec = be32_to_cpu(dic->di_ctime.t_nsec); - buf->bs_xflags = xfs_dic2xflags(dic); - buf->bs_extsize = be32_to_cpu(dic->di_extsize) << mp->m_sb.sb_blocklog; - buf->bs_extents = be32_to_cpu(dic->di_nextents); - buf->bs_gen = be32_to_cpu(dic->di_gen); - memset(buf->bs_pad, 0, sizeof(buf->bs_pad)); - buf->bs_dmevmask = be32_to_cpu(dic->di_dmevmask); - buf->bs_dmstate = be16_to_cpu(dic->di_dmstate); - buf->bs_aextents = be16_to_cpu(dic->di_anextents); - buf->bs_forkoff = XFS_DFORK_BOFF(dic); + if (!error) + *stat = BULKSTAT_RV_DIDONE; - switch (dic->di_format) { - case XFS_DINODE_FMT_DEV: - buf->bs_rdev = xfs_dinode_get_rdev(dic); - buf->bs_blksize = BLKDEV_IOSIZE; - buf->bs_blocks = 0; - break; - case XFS_DINODE_FMT_LOCAL: - case XFS_DINODE_FMT_UUID: - buf->bs_rdev = 0; - buf->bs_blksize = mp->m_sb.sb_blocksize; - buf->bs_blocks = 0; - break; - case XFS_DINODE_FMT_EXTENTS: - case XFS_DINODE_FMT_BTREE: - buf->bs_rdev = 0; - buf->bs_blksize = mp->m_sb.sb_blocksize; - buf->bs_blocks = be64_to_cpu(dic->di_nblocks); - break; - } + out_free: + kmem_free(buf); + return error; } /* Return 0 on success or positive error */ @@ -213,118 +169,19 @@ xfs_bulkstat_one_fmt( return 0; } -/* - * Return stat information for one inode. - * Return 0 if ok, else errno. - */ -int /* error status */ -xfs_bulkstat_one_int( - xfs_mount_t *mp, /* mount point for filesystem */ - xfs_ino_t ino, /* inode number to get data for */ - void __user *buffer, /* buffer to place output in */ - int ubsize, /* size of buffer */ - bulkstat_one_fmt_pf formatter, /* formatter, copy to user */ - xfs_daddr_t bno, /* starting bno of inode cluster */ - int *ubused, /* bytes used by me */ - void *dibuff, /* on-disk inode buffer */ - int *stat) /* BULKSTAT_RV_... */ -{ - xfs_bstat_t *buf; /* return buffer */ - int error = 0; /* error value */ - xfs_dinode_t *dip; /* dinode inode pointer */ - - dip = (xfs_dinode_t *)dibuff; - *stat = BULKSTAT_RV_NOTHING; - - if (!buffer || xfs_internal_inum(mp, ino)) - return XFS_ERROR(EINVAL); - - buf = kmem_alloc(sizeof(*buf), KM_SLEEP); - - if (dip == NULL) { - /* We're not being passed a pointer to a dinode. This happens - * if BULKSTAT_FG_IGET is selected. Do the iget. - */ - error = xfs_bulkstat_one_iget(mp, ino, bno, buf, stat); - if (error) - goto out_free; - } else { - xfs_bulkstat_one_dinode(mp, ino, dip, buf); - } - - error = formatter(buffer, ubsize, ubused, buf); - if (error) - goto out_free; - - *stat = BULKSTAT_RV_DIDONE; - - out_free: - kmem_free(buf); - return error; -} - int xfs_bulkstat_one( xfs_mount_t *mp, /* mount point for filesystem */ xfs_ino_t ino, /* inode number to get data for */ void __user *buffer, /* buffer to place output in */ int ubsize, /* size of buffer */ - void *private_data, /* my private data */ xfs_daddr_t bno, /* starting bno of inode cluster */ int *ubused, /* bytes used by me */ - void *dibuff, /* on-disk inode buffer */ int *stat) /* BULKSTAT_RV_... */ { return xfs_bulkstat_one_int(mp, ino, buffer, ubsize, xfs_bulkstat_one_fmt, bno, - ubused, dibuff, stat); -} - -/* - * Test to see whether we can use the ondisk inode directly, based - * on the given bulkstat flags, filling in dipp accordingly. - * Returns zero if the inode is dodgey. - */ -STATIC int -xfs_bulkstat_use_dinode( - xfs_mount_t *mp, - int flags, - xfs_buf_t *bp, - int clustidx, - xfs_dinode_t **dipp) -{ - xfs_dinode_t *dip; - unsigned int aformat; - - *dipp = NULL; - if (!bp || (flags & BULKSTAT_FG_IGET)) - return 1; - dip = (xfs_dinode_t *) - xfs_buf_offset(bp, clustidx << mp->m_sb.sb_inodelog); - /* - * Check the buffer containing the on-disk inode for di_mode == 0. - * This is to prevent xfs_bulkstat from picking up just reclaimed - * inodes that have their in-core state initialized but not flushed - * to disk yet. This is a temporary hack that would require a proper - * fix in the future. - */ - if (be16_to_cpu(dip->di_magic) != XFS_DINODE_MAGIC || - !XFS_DINODE_GOOD_VERSION(dip->di_version) || - !dip->di_mode) - return 0; - if (flags & BULKSTAT_FG_QUICK) { - *dipp = dip; - return 1; - } - /* BULKSTAT_FG_INLINE: if attr fork is local, or not there, use it */ - aformat = dip->di_aformat; - if ((XFS_DFORK_Q(dip) == 0) || - (aformat == XFS_DINODE_FMT_LOCAL) || - (aformat == XFS_DINODE_FMT_EXTENTS && !dip->di_anextents)) { - *dipp = dip; - return 1; - } - return 1; + ubused, stat); } #define XFS_BULKSTAT_UBLEFT(ubleft) ((ubleft) >= statstruct_size) @@ -338,10 +195,8 @@ xfs_bulkstat( xfs_ino_t *lastinop, /* last inode returned */ int *ubcountp, /* size of buffer/count returned */ bulkstat_one_pf formatter, /* func that'd fill a single buf */ - void *private_data,/* private data for formatter */ size_t statstruct_size, /* sizeof struct filling */ char __user *ubuffer, /* buffer with inode stats */ - int flags, /* defined in xfs_itable.h */ int *done) /* 1 if there are more stats to get */ { xfs_agblock_t agbno=0;/* allocation group block number */ @@ -376,14 +231,12 @@ xfs_bulkstat( int ubelem; /* spaces used in user's buffer */ int ubused; /* bytes used by formatter */ xfs_buf_t *bp; /* ptr to on-disk inode cluster buf */ - xfs_dinode_t *dip; /* ptr into bp for specific inode */ /* * Get the last inode value, see if there's nothing to do. */ ino = (xfs_ino_t)*lastinop; lastino = ino; - dip = NULL; agno = XFS_INO_TO_AGNO(mp, ino); agino = XFS_INO_TO_AGINO(mp, ino); if (agno >= mp->m_sb.sb_agcount || @@ -608,37 +461,6 @@ xfs_bulkstat( irbp->ir_startino) + ((chunkidx & nimask) >> mp->m_sb.sb_inopblog); - - if (flags & (BULKSTAT_FG_QUICK | - BULKSTAT_FG_INLINE)) { - int offset; - - ino = XFS_AGINO_TO_INO(mp, agno, - agino); - bno = XFS_AGB_TO_DADDR(mp, agno, - agbno); - - /* - * Get the inode cluster buffer - */ - if (bp) - xfs_buf_relse(bp); - - error = xfs_inotobp(mp, NULL, ino, &dip, - &bp, &offset, - XFS_IGET_BULKSTAT); - - if (!error) - clustidx = offset / mp->m_sb.sb_inodesize; - if (XFS_TEST_ERROR(error != 0, - mp, XFS_ERRTAG_BULKSTAT_READ_CHUNK, - XFS_RANDOM_BULKSTAT_READ_CHUNK)) { - bp = NULL; - ubleft = 0; - rval = error; - break; - } - } } ino = XFS_AGINO_TO_INO(mp, agno, agino); bno = XFS_AGB_TO_DADDR(mp, agno, agbno); @@ -654,35 +476,13 @@ xfs_bulkstat( * when the chunk is used up. */ irbp->ir_freecount++; - if (!xfs_bulkstat_use_dinode(mp, flags, bp, - clustidx, &dip)) { - lastino = ino; - continue; - } - /* - * If we need to do an iget, cannot hold bp. - * Drop it, until starting the next cluster. - */ - if ((flags & BULKSTAT_FG_INLINE) && !dip) { - if (bp) - xfs_buf_relse(bp); - bp = NULL; - } /* * Get the inode and fill in a single buffer. - * BULKSTAT_FG_QUICK uses dip to fill it in. - * BULKSTAT_FG_IGET uses igets. - * BULKSTAT_FG_INLINE uses dip if we have an - * inline attr fork, else igets. - * See: xfs_bulkstat_one & xfs_dm_bulkstat_one. - * This is also used to count inodes/blks, etc - * in xfs_qm_quotacheck. */ ubused = statstruct_size; - error = formatter(mp, ino, ubufp, - ubleft, private_data, - bno, &ubused, dip, &fmterror); + error = formatter(mp, ino, ubufp, ubleft, bno, + &ubused, &fmterror); if (fmterror == BULKSTAT_RV_NOTHING) { if (error && error != ENOENT && error != EINVAL) { @@ -775,7 +575,7 @@ xfs_bulkstat_single( ino = (xfs_ino_t)*lastinop; error = xfs_bulkstat_one(mp, ino, buffer, sizeof(xfs_bstat_t), - NULL, 0, NULL, NULL, &res); + 0, NULL, &res); if (error) { /* * Special case way failed, do it the "long" way @@ -784,8 +584,7 @@ xfs_bulkstat_single( (*lastinop)--; count = 1; if (xfs_bulkstat(mp, lastinop, &count, xfs_bulkstat_one, - NULL, sizeof(xfs_bstat_t), buffer, - BULKSTAT_FG_IGET, done)) + sizeof(xfs_bstat_t), buffer, done)) return error; if (count == 0 || (xfs_ino_t)*lastinop != ino) return error == EFSCORRUPTED ? diff --git a/fs/xfs/xfs_itable.h b/fs/xfs/xfs_itable.h index 20792bf..fea0339 100644 --- a/fs/xfs/xfs_itable.h +++ b/fs/xfs/xfs_itable.h @@ -27,10 +27,8 @@ typedef int (*bulkstat_one_pf)(struct xfs_mount *mp, xfs_ino_t ino, void __user *buffer, int ubsize, - void *private_data, xfs_daddr_t bno, int *ubused, - void *dip, int *stat); /* @@ -41,13 +39,6 @@ typedef int (*bulkstat_one_pf)(struct xfs_mount *mp, #define BULKSTAT_RV_GIVEUP 2 /* - * Values for bulkstat flag argument. - */ -#define BULKSTAT_FG_IGET 0x1 /* Go through the buffer cache */ -#define BULKSTAT_FG_QUICK 0x2 /* No iget, walk the dinode cluster */ -#define BULKSTAT_FG_INLINE 0x4 /* No iget if inline attrs */ - -/* * Return stat information in bulk (by-inode) for the filesystem. */ int /* error status */ @@ -56,10 +47,8 @@ xfs_bulkstat( xfs_ino_t *lastino, /* last inode returned */ int *count, /* size of buffer/count returned */ bulkstat_one_pf formatter, /* func that'd fill a single buf */ - void *private_data, /* private data for formatter */ size_t statstruct_size,/* sizeof struct that we're filling */ char __user *ubuffer,/* buffer with inode stats */ - int flags, /* flag to control access method */ int *done); /* 1 if there are more stats to get */ int @@ -84,7 +73,6 @@ xfs_bulkstat_one_int( bulkstat_one_fmt_pf formatter, xfs_daddr_t bno, int *ubused, - void *dibuff, int *stat); int @@ -93,10 +81,8 @@ xfs_bulkstat_one( xfs_ino_t ino, void __user *buffer, int ubsize, - void *private_data, xfs_daddr_t bno, int *ubused, - void *dibuff, int *stat); typedef int (*inumbers_fmt_pf)( -- 1.7.1 From BATV+f7366215ba6f319846b3+2490+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 18 03:19:55 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5I8Jrb0215133 for ; Fri, 18 Jun 2010 03:19:55 -0500 X-ASG-Debug-ID: 1276849351-51a9032f0000-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 EC5FC1B7666D for ; Fri, 18 Jun 2010 01:22:31 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Xr9YSVo48fhRFBsr for ; Fri, 18 Jun 2010 01:22:31 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OPWqL-00006K-Uq; Fri, 18 Jun 2010 08:22:29 +0000 Date: Fri, 18 Jun 2010 04:22:29 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com, security@kernel.org X-ASG-Orig-Subj: Re: [PATCH 4/4] xfs: remove block number from inode lookup code Subject: Re: [PATCH 4/4] xfs: remove block number from inode lookup code Message-ID: <20100618082229.GA30787@infradead.org> References: <1276846374-23916-1-git-send-email-david@fromorbit.com> <1276846374-23916-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1276846374-23916-5-git-send-email-david@fromorbit.com> 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: 1276849351 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean > - ip->i_imap.im_blkno = bno; > + ip->i_imap.im_blkno = 0; > error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, iget_flags); The im_blkno initialization before calling xfs_imap can be removed now. From eflorac@intellique.com Fri Jun 18 06:18: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.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5IBIaSg221015 for ; Fri, 18 Jun 2010 06:18:36 -0500 X-ASG-Debug-ID: 1276860069-32da03c20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B77313E44B4 for ; Fri, 18 Jun 2010 04:21:12 -0700 (PDT) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id SswQBzOpNLVYzHb1 for ; Fri, 18 Jun 2010 04:21:12 -0700 (PDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id E41A54C807F; Fri, 18 Jun 2010 13:21:04 +0200 (CEST) Date: Fri, 18 Jun 2010 13:21:08 +0200 From: Emmanuel Florac To: Thomas =?ISO-8859-1?Q?F=F8rde?= Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS Message-ID: <20100618132108.790921cf@harpe.intellique.com> In-Reply-To: References: Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1276860074 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32861 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Thu, 17 Jun 2010 15:18:26 +0200 Thomas F=F8rde =E9crivait: > i have run xfs_check without any verbos information given > i have run xfs_repair without any information errors fixed. That's unfortunate that you didn't post here before doing irreparable=20 damage. Any activity to the filesystem may delete permanently data, so you should stop using it completely until done with the rescue operations and unmount it. >=20 > when i try to mount the XFS filesystem of 10TB, my 7.8 TB of data is > now gone. >=20 > before: /dev/sdf1 10527858560 8801101708 > 1726756852 84% /D5 > after: /dev/sdf1 10527858560 528 > 10527858032 1% /D5 >=20 Some old versions of xfs_repair may fail on big FS. You didn't mention which version you're using, which distribution and which kernel. The hardware setup may be important, too. > help, where did my data go, and how can i get it back. Apparently xfs_repair deleted it because it was corrupt (alas, happen sometimes with xfs_repair before 2.8). The best thing to do is to get it back from backups. I suppose that you have no backup (people don't do any backup until they lose important data, which always occurs). If you have no backups, your last hope is to use a tool like photorec to find your data on the raw device; however it won't reconstruct the metadata (no names, no folders, no hierarchy, no user rights). BTW you need some other place to store the newly discovered files with at least as much space (7.8 TB). My condolences. I once lost 13TB and see, I'm not dead. You'll get over it somehow. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From thomas.forde@bergenofs.no Fri Jun 18 06:24:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.2 required=5.0 tests=BAYES_50,HTML_MESSAGE, J_CHICKENPOX_44,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 o5IBORbX221198 for ; Fri, 18 Jun 2010 06:24:27 -0500 X-ASG-Debug-ID: 1276860652-0d3101ab0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from deframx28.softcom.dk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0CD1A10F5A18 for ; Fri, 18 Jun 2010 04:30:53 -0700 (PDT) Received: from deframx28.softcom.dk (deframx28.softcom.dk [87.230.83.86]) by cuda.sgi.com with ESMTP id jipqQj2rKRoRFmjB for ; Fri, 18 Jun 2010 04:30:53 -0700 (PDT) Received: (qmail 26933 invoked by uid 74); 18 Jun 2010 11:27:03 -0000 Received: from 74.82-134-78.bkkb.no (82.134.78.74) by deframx28.softcom.dk (envelope-from ) with ESMTP. tag msg.1276860422.998174.22827 (Processed in 0.191475 secs); 18 Jun 2010 11:27:03 -0000 X-SoftScan-Status: clean In-Reply-To: <20100618132108.790921cf@harpe.intellique.com> References: <20100618132108.790921cf@harpe.intellique.com> To: Emmanuel Florac Cc: xfs@oss.sgi.com MIME-Version: 1.0 X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS X-KeepSent: 450B8187:BD5256B0-C1257746:003E79FF; type=4; name=$KeepSent X-Mailer: Lotus Notes Release 8.5.1 FP3 May 24, 2010 Message-ID: From: =?ISO-8859-1?Q?Thomas_F=F8rde?= Date: Fri, 18 Jun 2010 13:27:01 +0200 X-MIMETrack: Serialize by Router on LNBOS01/BOS(Release 8.5.1|September 28, 2009) at 18.06.2010 13:27:02, Serialize complete at 18.06.2010 13:27:02 Content-Type: multipart/alternative; boundary="=_alternative 003EE62CC1257746_=" X-Barracuda-Connect: deframx28.softcom.dk[87.230.83.86] X-Barracuda-Start-Time: 1276860654 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32861 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multipart message in MIME format. --=_alternative 003EE62CC1257746_= Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: quoted-printable both the xfs=5Fcheck and xfs=5FReapir was done from a unmounted system, the= =20 system has not been mounted or used since. its a IBM x3650 with stadnard 2x73GB disk. [root@strmng04 ~]# cat /etc/issue CentOS release 4.7 (Final) Kernel \r on an \m [root@strmng04 ~]# uname -a Linux strmng04 2.6.9-78.0.5.ELsmp #1 SMP Wed Oct 8 07:06:30 EDT 2008=20 x86=5F64 x86=5F64 x86=5F64 GNU/Linux there is no backup no, as how to backup 8 TB of data,very expensive tape=20 wise. xfs=5Firecover ias been mentioned to me, so my fingers are crossed. Sincerely ------------------------------------------------------------------- Thomas F=F8rde IT-Manager=20 Mobile +47 90 41 41 90 Fax +47 55 31 67 66 thomas.forde@bergenofs.no www.bergenofs.no ------------------------------------------------------------------- Bergen Oilfield Services AS Address: Nedre Aastveit 12 NO-5106 Ovre Ervik ------------------------------------------------------------------- Please consider the environment before printing From: Emmanuel Florac To: Thomas F=F8rde Cc: xfs@oss.sgi.com Date: 18.06.2010 13:21 Subject: Re: Help with XFS Le Thu, 17 Jun 2010 15:18:26 +0200 Thomas F=F8rde =E9crivait: > i have run xfs=5Fcheck without any verbos information given > i have run xfs=5Frepair without any information errors fixed. That's unfortunate that you didn't post here before doing irreparable=20 damage. Any activity to the filesystem may delete permanently data, so you should stop using it completely until done with the rescue operations and unmount it. >=20 > when i try to mount the XFS filesystem of 10TB, my 7.8 TB of data is > now gone. >=20 > before: /dev/sdf1 10527858560 8801101708 > 1726756852 84% /D5 > after: /dev/sdf1 10527858560 528 > 10527858032 1% /D5 >=20 Some old versions of xfs=5Frepair may fail on big FS. You didn't mention which version you're using, which distribution and which kernel. The hardware setup may be important, too. > help, where did my data go, and how can i get it back. Apparently xfs=5Frepair deleted it because it was corrupt (alas, happen sometimes with xfs=5Frepair before 2.8). The best thing to do is to get it back from backups. I suppose that you have no backup (people don't do any backup until they lose important data, which always occurs). If you have no backups, your last hope is to use a tool like photorec to find your data on the raw device; however it won't reconstruct the metadata (no names, no folders, no hierarchy, no user rights). BTW you need some other place to store the newly discovered files with at least as much space (7.8 TB). My condolences. I once lost 13TB and see, I'm not dead. You'll get over it somehow. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ --=_alternative 003EE62CC1257746_= Content-Type: text/html; charset="ISO-8859-1" Content-Transfer-Encoding: quoted-printable both the xfs=5Fcheck and xfs=5FReapir wa= s done from a unmounted system, the system has not been mounted or used since.

its a IBM x3650 with stadnard 2x73GB disk.

[root@strmng04 ~]# cat /etc/issue
CentOS release 4.7 (Final)
Kernel \r on an \m

[root@strmng04 ~]# uname -a
Linux strmng04 2.6.9-78.0.5.ELsmp #1 SMP Wed Oct 8 07:06:30 EDT 2008 x86=5F64 x86=5F64 x86=5F64 GNU/Linux


there is no backup no, as how to bac= kup 8 TB of data,very expensive tape wise.

xfs=5Firecover ias been mentioned to= me, so my fingers are crossed.


Sincerely
-------------------------------------------------------------------
Thomas F=F8rde    IT-Manager
Mobile +47 90 41 41 90   Fax +47 55 31 67 66
thomas.forde@bergenofs.no    
<= font size=3D2 face=3D"sans-serif">www.bergenofs.no

-------------------------------------------------------------------
Bergen Oilfield Services AS
Address: Nedre Aastveit 12    NO-5106 Ovre Ervik
-------------------------------------------------------------------

Please consider the environment before printing




From:     =    Emmanuel Florac <eflorac= @intellique.com>
To:     &n= bsp;  Thomas F=F8rde <thomas.f= orde@bergenofs.no>
Cc:     &n= bsp;  xfs@oss.sgi.com
Date:     =    18.06.2010 13:21
Subject:   &nbs= p;    Re: Help with XFS




Le Thu, 17 Jun 2010 15:18:26 +0200
Thomas F=F8rde <thomas.forde@bergenofs.no> =E9crivait:

> i have run xfs=5Fcheck without any verbos information given
> i have run xfs=5Frepair without any information errors fixed.

That's unfortunate that you didn't post here before doing irreparable
damage. Any activity to the filesystem may delete permanently data, so
you should stop using it completely until done with the rescue
operations and unmount it.

>
> when i try to mount the XFS filesystem of 10TB, my 7.8 TB of data is
> now gone.
>
> before:         /dev/sdf1            10527858560 8801101708
> 1726756852 84% /D5
> after:          /dev/sdf1            10527858560       528
> 10527858032 1% /D5
>

Some old versions of xfs=5Frepair may fail on big FS. You didn't mention
which version you're using, which distribution and which kernel. The
hardware setup may be important, too.

> help, where did my data go, and how can i get it back.

Apparently xfs=5Frepair deleted it because it was corrupt (alas, happen
sometimes with xfs=5Frepair before 2.8). The best thing to do is to get it<= br> back from backups. I suppose that you have no backup (people don't do
any backup until they lose important data, which always occurs).

If you have no backups, your last hope is to use a tool like photorec
to find your data on the raw device; however it won't reconstruct the
metadata (no names, no folders, no hierarchy, no user rights). BTW you
need some other place to store the newly discovered files with at least
as much space (7.8 TB).

My condolences. I once lost 13TB and see, I'm not dead. You'll get over
it somehow.
--
------------------------------------------------------------------------
Emmanuel Florac     |   Direction technique
                   |   Intellique
                   |                 <eflorac@intellique.com>
                   |   +33 1 78 94 84 02
------------------------------------------------------------------------


--=_alternative 003EE62CC1257746_=-- From eflorac@intellique.com Fri Jun 18 06:32: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.5 required=5.0 tests=BAYES_00,J_CHICKENPOX_44, 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 o5IBWNK3221535 for ; Fri, 18 Jun 2010 06:32:23 -0500 X-ASG-Debug-ID: 1276861127-09db026f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9E6E514A69F5 for ; Fri, 18 Jun 2010 04:38:48 -0700 (PDT) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id W0yrAExCewCRX7AG for ; Fri, 18 Jun 2010 04:38:48 -0700 (PDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id F2C434C8037; Fri, 18 Jun 2010 13:34:53 +0200 (CEST) Date: Fri, 18 Jun 2010 13:34:58 +0200 From: Emmanuel Florac To: Thomas =?ISO-8859-1?Q?F=F8rde?= Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS Message-ID: <20100618133458.6640ce96@harpe.intellique.com> In-Reply-To: References: <20100618132108.790921cf@harpe.intellique.com> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1276861130 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32863 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Fri, 18 Jun 2010 13:27:01 +0200 Thomas F=F8rde =E9crivait: > both the xfs_check and xfs_Reapir was done from a unmounted system, > the system has not been mounted or used since. That's good. Did you run xfs_repair -n first ? Did you run=20 xfs_repair -L afterwards? > its a IBM x3650 with stadnard 2x73GB disk. But what about the RAID array?=20 =20 > [root@strmng04 ~]# cat /etc/issue > CentOS release 4.7 (Final) > Kernel \r on an \m >=20 > [root@strmng04 ~]# uname -a > Linux strmng04 2.6.9-78.0.5.ELsmp #1 SMP Wed Oct 8 07:06:30 EDT 2008=20 > x86_64 x86_64 x86_64 GNU/Linux >=20 >=20 > there is no backup no, as how to backup 8 TB of data,very expensive > tape wise. You could have a disk backup on cheaper drives. And current tapes are 800 GB (LTO-3) or 1.5 TB (LTO-4), and libraries are cheaper nowadays. > xfs_irecover ias been mentioned to me, so my fingers are crossed. >=20 If your data is a huge bunch of media files or similar, photorec really can help you as a very last resort, though you'll have to manually sort through all this data... good luck, --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From BATV+f7366215ba6f319846b3+2490+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 18 06:39:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5IBdIqq221756 for ; Fri, 18 Jun 2010 06:39:20 -0500 X-ASG-Debug-ID: 1276861316-22b101750000-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 595ED1E10ABB for ; Fri, 18 Jun 2010 04:41:56 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id GVmYJsndoYS3Kjcs for ; Fri, 18 Jun 2010 04:41:56 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OPZxM-00068X-Ml; Fri, 18 Jun 2010 11:41:56 +0000 Date: Fri, 18 Jun 2010 07:41:56 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com, security@kernel.org X-ASG-Orig-Subj: Re: [PATCH 2/4] xfs: validate untrusted inode numbers during lookup Subject: Re: [PATCH 2/4] xfs: validate untrusted inode numbers during lookup Message-ID: <20100618114156.GA5417@infradead.org> References: <1276846374-23916-1-git-send-email-david@fromorbit.com> <1276846374-23916-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1276846374-23916-3-git-send-email-david@fromorbit.com> 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: 1276861317 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 18, 2010 at 05:32:52PM +1000, Dave Chinner wrote: > +static int > +xfs_imap_lookup( STATIC to keep the gcc inliner from overdoing thing? > + xfs_mount_t *mp, > + xfs_trans_t *tp, > +{ > + xfs_inobt_rec_incore_t rec; > + xfs_btree_cur_t *cur; > + xfs_buf_t *agbp; Please use the struct versions of these instead of the typedefs. > +#ifdef DEBUG > + xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " > + "xfs_inobt_get_rec() failed"); > +#endif /* DEBUG */ > + error = XFS_ERROR(EINVAL); No need to print these even for debug kernels I think. And even then we shouldn't do it if the untrusted flag is set. > + } > +error0: I'd just call it out, or replace the goto by and if/else From BATV+f7366215ba6f319846b3+2490+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 18 06:40:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5IBeF2P221808 for ; Fri, 18 Jun 2010 06:40:15 -0500 X-ASG-Debug-ID: 1276861373-0161033c0000-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 223301E10AC7 for ; Fri, 18 Jun 2010 04:42:54 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id FrwP5Y2C6DqSIDc4 for ; Fri, 18 Jun 2010 04:42:54 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OPZyH-0006Es-Ql; Fri, 18 Jun 2010 11:42:53 +0000 Date: Fri, 18 Jun 2010 07:42:53 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com, security@kernel.org X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: rename XFS_IGET_BULKSTAT to XFS_IGET_UNTRUSTED Subject: Re: [PATCH 3/4] xfs: rename XFS_IGET_BULKSTAT to XFS_IGET_UNTRUSTED Message-ID: <20100618114253.GB5417@infradead.org> References: <1276846374-23916-1-git-send-email-david@fromorbit.com> <1276846374-23916-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1276846374-23916-4-git-send-email-david@fromorbit.com> 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: 1276861374 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 18, 2010 at 05:32:53PM +1000, Dave Chinner wrote: > /* no diagnostics for bulkstat, ino comes from userspace */ > - if (flags & XFS_IGET_BULKSTAT) > + if (flags & XFS_IGET_UNTRUSTED) The comment could use an update as well. From thomas.forde@bergenofs.no Fri Jun 18 06:41: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.2 required=5.0 tests=BAYES_50,HTML_MESSAGE, J_CHICKENPOX_44,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5IBfQM8221872 for ; Fri, 18 Jun 2010 06:41:26 -0500 X-ASG-Debug-ID: 1276861442-50d902690000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from deframx28.softcom.dk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id ACB633E474B for ; Fri, 18 Jun 2010 04:44:02 -0700 (PDT) Received: from deframx28.softcom.dk (deframx28.softcom.dk [87.230.83.86]) by cuda.sgi.com with ESMTP id 3j8q0d2avxvAWb10 for ; Fri, 18 Jun 2010 04:44:02 -0700 (PDT) Received: (qmail 5814 invoked by uid 74); 18 Jun 2010 11:44:01 -0000 Received: from 74.82-134-78.bkkb.no (82.134.78.74) by deframx28.softcom.dk (envelope-from ) with ESMTP. tag msg.1276861439.700196.5849 (Processed in 2.131653 secs); 18 Jun 2010 11:44:01 -0000 X-SoftScan-Status: clean In-Reply-To: <20100618133458.6640ce96@harpe.intellique.com> References: <20100618132108.790921cf@harpe.intellique.com> <20100618133458.6640ce96@harpe.intellique.com> To: Emmanuel Florac Cc: xfs@oss.sgi.com MIME-Version: 1.0 X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS X-KeepSent: 0E234D8E:F048FF4D-C1257746:003FC10E; type=4; name=$KeepSent X-Mailer: Lotus Notes Release 8.5.1 FP3 May 24, 2010 Message-ID: From: =?ISO-8859-1?Q?Thomas_F=F8rde?= Date: Fri, 18 Jun 2010 13:43:57 +0200 X-MIMETrack: Serialize by Router on LNBOS01/BOS(Release 8.5.1|September 28, 2009) at 18.06.2010 13:43:58, Serialize complete at 18.06.2010 13:43:58 Content-Type: multipart/alternative; boundary="=_alternative 00407332C1257746_=" X-Barracuda-Connect: deframx28.softcom.dk[87.230.83.86] X-Barracuda-Start-Time: 1276861443 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32861 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multipart message in MIME format. --=_alternative 00407332C1257746_= Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: quoted-printable the raid array is a FC SAN array consisting of DS4700 unit with EXP810=20 expansion system xfs=5Fcheck first, xfs=5Frepair -n, and xfs=5Frepair xfs=5FRepair -L has not been used. its seismisc processed data, large text files. Sincerely ------------------------------------------------------------------- Thomas F=F8rde IT-Manager=20 Mobile +47 90 41 41 90 Fax +47 55 31 67 66 thomas.forde@bergenofs.no www.bergenofs.no ------------------------------------------------------------------- Bergen Oilfield Services AS Address: Nedre Aastveit 12 NO-5106 Ovre Ervik ------------------------------------------------------------------- Please consider the environment before printing From: Emmanuel Florac To: Thomas F=F8rde Cc: xfs@oss.sgi.com Date: 18.06.2010 13:35 Subject: Re: Help with XFS Le Fri, 18 Jun 2010 13:27:01 +0200 Thomas F=F8rde =E9crivait: > both the xfs=5Fcheck and xfs=5FReapir was done from a unmounted system, > the system has not been mounted or used since. That's good. Did you run xfs=5Frepair -n first ? Did you run=20 xfs=5Frepair -L afterwards? > its a IBM x3650 with stadnard 2x73GB disk. But what about the RAID array?=20 =20 > [root@strmng04 ~]# cat /etc/issue > CentOS release 4.7 (Final) > Kernel \r on an \m >=20 > [root@strmng04 ~]# uname -a > Linux strmng04 2.6.9-78.0.5.ELsmp #1 SMP Wed Oct 8 07:06:30 EDT 2008=20 > x86=5F64 x86=5F64 x86=5F64 GNU/Linux >=20 >=20 > there is no backup no, as how to backup 8 TB of data,very expensive > tape wise. You could have a disk backup on cheaper drives. And current tapes are 800 GB (LTO-3) or 1.5 TB (LTO-4), and libraries are cheaper nowadays. > xfs=5Firecover ias been mentioned to me, so my fingers are crossed. >=20 If your data is a huge bunch of media files or similar, photorec really can help you as a very last resort, though you'll have to manually sort through all this data... good luck, --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ --=_alternative 00407332C1257746_= Content-Type: text/html; charset="ISO-8859-1" Content-Transfer-Encoding: quoted-printable the raid array is a FC SAN array consist= ing of DS4700 unit with EXP810 expansion system

xfs=5Fcheck first, xfs=5Frepair -n, = and xfs=5Frepair

xfs=5FRepair -L has not been used.

its seismisc processed data, large t= ext files.



Sincerely
-------------------------------------------------------------------
Thomas F=F8rde    IT-Manager
Mobile +47 90 41 41 90   Fax +47 55 31 67 66
thomas.forde@bergenofs.no    
<= font size=3D2 face=3D"sans-serif">www.bergenofs.no

-------------------------------------------------------------------
Bergen Oilfield Services AS
Address: Nedre Aastveit 12    NO-5106 Ovre Ervik
-------------------------------------------------------------------

Please consider the environment before printing




From:     =    Emmanuel Florac <eflorac= @intellique.com>
To:     &n= bsp;  Thomas F=F8rde <thomas.f= orde@bergenofs.no>
Cc:     &n= bsp;  xfs@oss.sgi.com
Date:     =    18.06.2010 13:35
Subject:   &nbs= p;    Re: Help with XFS




Le Fri, 18 Jun 2010 13:27:01 +0200
Thomas F=F8rde <thomas.forde@bergenofs.no> =E9crivait:

> both the xfs=5Fcheck and xfs=5FReapir was done from a unmounted system= ,
> the system has not been mounted or used since.

That's good. Did you run xfs=5Frepair -n first ? Did you run
xfs=5Frepair -L afterwards?

> its a IBM x3650 with stadnard 2x73GB disk.

But what about the RAID array?

> [root@strmng04 ~]# cat /etc/issue
> CentOS release 4.7 (Final)
> Kernel \r on an \m
>
> [root@strmng04 ~]# uname -a
> Linux strmng04 2.6.9-78.0.5.ELsmp #1 SMP Wed Oct 8 07:06:30 EDT 2008
> x86=5F64 x86=5F64 x86=5F64 GNU/Linux
>
>
> there is no backup no, as how to backup 8 TB of data,very expensive
> tape wise.

You could have a disk backup on cheaper drives. And current tapes are
800 GB (LTO-3) or 1.5 TB (LTO-4), and libraries are cheaper nowadays.

> xfs=5Firecover ias been mentioned to me, so my fingers are crossed.
>

If your data is a huge bunch of media files or similar, photorec really
can help you as a very last resort, though you'll have to manually sort
through all this data...

good luck,
--
------------------------------------------------------------------------
Emmanuel Florac     |   Direction technique
                   |   Intellique
                   |                 <eflorac@intellique.com>
                   |   +33 1 78 94 84 02
------------------------------------------------------------------------


--=_alternative 00407332C1257746_=-- From eflorac@intellique.com Fri Jun 18 06:57:55 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5IBvsIp222671 for ; Fri, 18 Jun 2010 06:57:55 -0500 X-ASG-Debug-ID: 1276862427-50d2030c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2F10D3E4627 for ; Fri, 18 Jun 2010 05:00:31 -0700 (PDT) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id MVALPzKifeHv8RCE for ; Fri, 18 Jun 2010 05:00:31 -0700 (PDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id A7BE44C809B; Fri, 18 Jun 2010 14:00:23 +0200 (CEST) Date: Fri, 18 Jun 2010 14:00:28 +0200 From: Emmanuel Florac To: Thomas =?ISO-8859-1?Q?F=F8rde?= Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS Message-ID: <20100618140028.05650928@harpe.intellique.com> In-Reply-To: References: <20100618132108.790921cf@harpe.intellique.com> <20100618133458.6640ce96@harpe.intellique.com> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1276862433 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Fri, 18 Jun 2010 13:43:57 +0200 Thomas F=C3=B8rde =C3=A9crivait: > the raid array is a FC SAN array consisting of DS4700 unit with > EXP810 expansion system >=20 > xfs_check first, xfs_repair -n, and xfs_repair >=20 > xfs_Repair -L has not been used. That's fortunate, maybe something can be saved from that. > its seismisc processed data, large text files. I see. Extremely expensive to reproduce...=20 If you know the file structure and the metadata isn't much ineresting, a simple perl or python script can scrap the raw device for the data. I've done it before. I can send you code snippets if you want. Did you have any success compiling xfs_irecover? It's a side note but one of my customers is specialised in seismic data acquisition, and record every data twice on two different RAID-1 systems and always keep at least two copies of everything, plus an on-tape copy... A commodity 16TB NAS costs much less (10000 =E2=82=AC or le= ss) than the data it holds and makes a nice backup system. NOTHING replaces a backup. Your system WILL fail someday (well it has now apparently). --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From thomas.forde@bergenofs.no Fri Jun 18 07:14: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=4.1 required=5.0 tests=BAYES_50,HTML_MESSAGE, MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5ICEsI8223200 for ; Fri, 18 Jun 2010 07:14:54 -0500 X-ASG-Debug-ID: 1276863451-39aa016c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from deframx28.softcom.dk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 35ACE1E10EC1 for ; Fri, 18 Jun 2010 05:17:31 -0700 (PDT) Received: from deframx28.softcom.dk (deframx28.softcom.dk [87.230.83.86]) by cuda.sgi.com with ESMTP id TZXaDiSGeKmiy56L for ; Fri, 18 Jun 2010 05:17:31 -0700 (PDT) Received: (qmail 23021 invoked by uid 74); 18 Jun 2010 12:17:30 -0000 Received: from 74.82-134-78.bkkb.no (82.134.78.74) by deframx28.softcom.dk (envelope-from ) with ESMTP. tag msg.1276863450.538722.25300 (Processed in 0.195255 secs); 18 Jun 2010 12:17:30 -0000 X-SoftScan-Status: clean In-Reply-To: <20100618140028.05650928@harpe.intellique.com> References: <20100618132108.790921cf@harpe.intellique.com> <20100618133458.6640ce96@harpe.intellique.com> <20100618140028.05650928@harpe.intellique.com> To: Emmanuel Florac Cc: xfs@oss.sgi.com MIME-Version: 1.0 X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS X-KeepSent: 9654ECF8:CC8A338F-C1257746:00437A9B; type=4; name=$KeepSent X-Mailer: Lotus Notes Release 8.5.1 FP3 May 24, 2010 Message-ID: From: =?ISO-8859-1?Q?Thomas_F=F8rde?= Date: Fri, 18 Jun 2010 14:17:29 +0200 X-MIMETrack: Serialize by Router on LNBOS01/BOS(Release 8.5.1|September 28, 2009) at 18.06.2010 14:17:29, Serialize complete at 18.06.2010 14:17:29 Content-Type: multipart/alternative; boundary="=_alternative 004384DFC1257746_=" X-Barracuda-Connect: deframx28.softcom.dk[87.230.83.86] X-Barracuda-Start-Time: 1276863452 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multipart message in MIME format. --=_alternative 004384DFC1257746_= Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 Z290IHRoZSBsaWJYSCBpbnN0YWxsZWQgYW5kIGNvbXBpbGVkLCBidXQgZ2V0IGEgc2hhcmVkLjIy IGVycm9yIGZpbGUgZG9lcyANCm5vdCBleGlzdCB0cnlpbmcgdG8gcnVuIGl0Lg0KDQoNCg0KU2lu Y2VyZWx5DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tDQpUaG9tYXMgRsO4cmRlICAgIElULU1hbmFnZXIgDQpNb2JpbGUg KzQ3IDkwIDQxIDQxIDkwICAgRmF4ICs0NyA1NSAzMSA2NyA2Ng0KdGhvbWFzLmZvcmRlQGJlcmdl bm9mcy5ubyAgICAgd3d3LmJlcmdlbm9mcy5ubw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KQmVyZ2VuIE9pbGZpZWxk IFNlcnZpY2VzIEFTDQpBZGRyZXNzOiBOZWRyZSBBYXN0dmVpdCAxMiAgICBOTy01MTA2IE92cmUg RXJ2aWsNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0NCg0KUGxlYXNlIGNvbnNpZGVyIHRoZSBlbnZpcm9ubWVudCBiZWZv cmUgcHJpbnRpbmcNCg0KDQoNCkZyb206ICAgRW1tYW51ZWwgRmxvcmFjIDxlZmxvcmFjQGludGVs bGlxdWUuY29tPg0KVG86ICAgICBUaG9tYXMgRsO4cmRlIDx0aG9tYXMuZm9yZGVAYmVyZ2Vub2Zz Lm5vPg0KQ2M6ICAgICB4ZnNAb3NzLnNnaS5jb20NCkRhdGU6ICAgMTguMDYuMjAxMCAxNDowMA0K U3ViamVjdDogICAgICAgIFJlOiBIZWxwIHdpdGggWEZTDQoNCg0KDQpMZSBGcmksIDE4IEp1biAy MDEwIDEzOjQzOjU3ICswMjAwDQpUaG9tYXMgRsO4cmRlIDx0aG9tYXMuZm9yZGVAYmVyZ2Vub2Zz Lm5vPiDDqWNyaXZhaXQ6DQoNCj4gdGhlIHJhaWQgYXJyYXkgaXMgYSBGQyBTQU4gYXJyYXkgY29u c2lzdGluZyBvZiBEUzQ3MDAgdW5pdCB3aXRoDQo+IEVYUDgxMCBleHBhbnNpb24gc3lzdGVtDQo+ IA0KPiB4ZnNfY2hlY2sgZmlyc3QsIHhmc19yZXBhaXIgLW4sIGFuZCB4ZnNfcmVwYWlyDQo+IA0K PiB4ZnNfUmVwYWlyIC1MIGhhcyBub3QgYmVlbiB1c2VkLg0KDQpUaGF0J3MgZm9ydHVuYXRlLCBt YXliZSBzb21ldGhpbmcgY2FuIGJlIHNhdmVkIGZyb20gdGhhdC4NCg0KPiBpdHMgc2Vpc21pc2Mg cHJvY2Vzc2VkIGRhdGEsIGxhcmdlIHRleHQgZmlsZXMuDQpJIHNlZS4gRXh0cmVtZWx5IGV4cGVu c2l2ZSB0byByZXByb2R1Y2UuLi4gDQoNCklmIHlvdSBrbm93IHRoZSBmaWxlIHN0cnVjdHVyZSBh bmQgdGhlIG1ldGFkYXRhIGlzbid0IG11Y2ggaW5lcmVzdGluZywNCmEgc2ltcGxlIHBlcmwgb3Ig cHl0aG9uIHNjcmlwdCBjYW4gc2NyYXAgdGhlIHJhdyBkZXZpY2UgZm9yIHRoZSBkYXRhLg0KSSd2 ZSBkb25lIGl0IGJlZm9yZS4gSSBjYW4gc2VuZCB5b3UgY29kZSBzbmlwcGV0cyBpZiB5b3Ugd2Fu dC4NCg0KRGlkIHlvdSBoYXZlIGFueSBzdWNjZXNzIGNvbXBpbGluZyB4ZnNfaXJlY292ZXI/DQoN Ckl0J3MgYSBzaWRlIG5vdGUgYnV0IG9uZSBvZiBteSBjdXN0b21lcnMgaXMgc3BlY2lhbGlzZWQg aW4gc2Vpc21pYyBkYXRhDQphY3F1aXNpdGlvbiwgYW5kIHJlY29yZCBldmVyeSBkYXRhIHR3aWNl IG9uIHR3byBkaWZmZXJlbnQgUkFJRC0xDQpzeXN0ZW1zIGFuZCBhbHdheXMga2VlcCBhdCBsZWFz dCB0d28gY29waWVzIG9mIGV2ZXJ5dGhpbmcsIHBsdXMgYW4NCm9uLXRhcGUgY29weS4uLiBBIGNv bW1vZGl0eSAxNlRCIE5BUyBjb3N0cyBtdWNoIGxlc3MgKDEwMDAwIOKCrCBvciBsZXNzKQ0KdGhh biB0aGUgZGF0YSBpdCBob2xkcyBhbmQgbWFrZXMgYSBuaWNlIGJhY2t1cCBzeXN0ZW0uIE5PVEhJ TkcgcmVwbGFjZXMNCmEgYmFja3VwLiBZb3VyIHN5c3RlbSBXSUxMIGZhaWwgc29tZWRheSAod2Vs bCBpdCBoYXMgbm93IGFwcGFyZW50bHkpLg0KDQotLSANCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KRW1tYW51 ZWwgRmxvcmFjICAgICB8ICAgRGlyZWN0aW9uIHRlY2huaXF1ZQ0KICAgICAgICAgICAgICAgICAg ICB8ICAgSW50ZWxsaXF1ZQ0KICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgPGVmbG9y YWNAaW50ZWxsaXF1ZS5jb20+DQogICAgICAgICAgICAgICAgICAgIHwgICArMzMgMSA3OCA5NCA4 NCAwMg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KDQo= --=_alternative 004384DFC1257746_= Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGZvbnQgc2l6ZT0yIGZhY2U9InNhbnMtc2VyaWYiPmdvdCB0aGUgbGliWEggaW5zdGFsbGVkIGFu ZCBjb21waWxlZCwgYnV0DQpnZXQgYSBzaGFyZWQuMjIgZXJyb3IgZmlsZSBkb2VzIG5vdCBleGlz dCB0cnlpbmcgdG8gcnVuIGl0LjwvZm9udD4NCjxicj4NCjxicj48Zm9udCBzaXplPTIgZmFjZT0i c2Fucy1zZXJpZiI+PGJyPg0KPGJyPg0KU2luY2VyZWx5PGJyPg0KLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTxicj4NClRo b21hcyBGw7hyZGUgJm5ic3A7ICZuYnNwO0lULU1hbmFnZXIgPGJyPg0KTW9iaWxlICs0NyA5MCA0 MSA0MSA5MCAmbmJzcDsgRmF4ICs0NyA1NSAzMSA2NyA2Njxicj4NCnRob21hcy5mb3JkZUBiZXJn ZW5vZnMubm8gJm5ic3A7ICZuYnNwOyA8L2ZvbnQ+PGEgaHJlZj13d3cuYmVyZ2Vub2ZzLm5vPjxm b250IHNpemU9MiBmYWNlPSJzYW5zLXNlcmlmIj53d3cuYmVyZ2Vub2ZzLm5vPC9mb250PjwvYT48 Zm9udCBzaXplPTIgZmFjZT0ic2Fucy1zZXJpZiI+PGJyPg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTxicj4NCkJlcmdl biBPaWxmaWVsZCBTZXJ2aWNlcyBBUzxicj4NCkFkZHJlc3M6IE5lZHJlIEFhc3R2ZWl0IDEyICZu YnNwOyAmbmJzcDtOTy01MTA2IE92cmUgRXJ2aWs8YnI+DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPGJyPg0KPGJyPg0K UGxlYXNlIGNvbnNpZGVyIHRoZSBlbnZpcm9ubWVudCBiZWZvcmUgcHJpbnRpbmc8L2ZvbnQ+DQo8 YnI+DQo8YnI+DQo8YnI+DQo8YnI+PGZvbnQgc2l6ZT0xIGNvbG9yPSM1ZjVmNWYgZmFjZT0ic2Fu cy1zZXJpZiI+RnJvbTogJm5ic3A7ICZuYnNwOyAmbmJzcDsNCiZuYnNwOzwvZm9udD48Zm9udCBz aXplPTEgZmFjZT0ic2Fucy1zZXJpZiI+RW1tYW51ZWwgRmxvcmFjICZsdDtlZmxvcmFjQGludGVs bGlxdWUuY29tJmd0OzwvZm9udD4NCjxicj48Zm9udCBzaXplPTEgY29sb3I9IzVmNWY1ZiBmYWNl PSJzYW5zLXNlcmlmIj5UbzogJm5ic3A7ICZuYnNwOyAmbmJzcDsNCiZuYnNwOzwvZm9udD48Zm9u dCBzaXplPTEgZmFjZT0ic2Fucy1zZXJpZiI+VGhvbWFzIEbDuHJkZSAmbHQ7dGhvbWFzLmZvcmRl QGJlcmdlbm9mcy5ubyZndDs8L2ZvbnQ+DQo8YnI+PGZvbnQgc2l6ZT0xIGNvbG9yPSM1ZjVmNWYg ZmFjZT0ic2Fucy1zZXJpZiI+Q2M6ICZuYnNwOyAmbmJzcDsgJm5ic3A7DQombmJzcDs8L2ZvbnQ+ PGZvbnQgc2l6ZT0xIGZhY2U9InNhbnMtc2VyaWYiPnhmc0Bvc3Muc2dpLmNvbTwvZm9udD4NCjxi cj48Zm9udCBzaXplPTEgY29sb3I9IzVmNWY1ZiBmYWNlPSJzYW5zLXNlcmlmIj5EYXRlOiAmbmJz cDsgJm5ic3A7ICZuYnNwOw0KJm5ic3A7PC9mb250Pjxmb250IHNpemU9MSBmYWNlPSJzYW5zLXNl cmlmIj4xOC4wNi4yMDEwIDE0OjAwPC9mb250Pg0KPGJyPjxmb250IHNpemU9MSBjb2xvcj0jNWY1 ZjVmIGZhY2U9InNhbnMtc2VyaWYiPlN1YmplY3Q6ICZuYnNwOyAmbmJzcDsNCiZuYnNwOyAmbmJz cDs8L2ZvbnQ+PGZvbnQgc2l6ZT0xIGZhY2U9InNhbnMtc2VyaWYiPlJlOiBIZWxwIHdpdGgNClhG UzwvZm9udD4NCjxicj4NCjxociBub3NoYWRlPg0KPGJyPg0KPGJyPg0KPGJyPjx0dD48Zm9udCBz aXplPTI+TGUgRnJpLCAxOCBKdW4gMjAxMCAxMzo0Mzo1NyArMDIwMDxicj4NClRob21hcyBGw7hy ZGUgJmx0O3Rob21hcy5mb3JkZUBiZXJnZW5vZnMubm8mZ3Q7IMOpY3JpdmFpdDo8YnI+DQo8YnI+ DQomZ3Q7IHRoZSByYWlkIGFycmF5IGlzIGEgRkMgU0FOIGFycmF5IGNvbnNpc3Rpbmcgb2YgRFM0 NzAwIHVuaXQgd2l0aDxicj4NCiZndDsgRVhQODEwIGV4cGFuc2lvbiBzeXN0ZW08YnI+DQomZ3Q7 IDxicj4NCiZndDsgeGZzX2NoZWNrIGZpcnN0LCB4ZnNfcmVwYWlyIC1uLCBhbmQgeGZzX3JlcGFp cjxicj4NCiZndDsgPGJyPg0KJmd0OyB4ZnNfUmVwYWlyIC1MIGhhcyBub3QgYmVlbiB1c2VkLjxi cj4NCjxicj4NClRoYXQncyBmb3J0dW5hdGUsIG1heWJlIHNvbWV0aGluZyBjYW4gYmUgc2F2ZWQg ZnJvbSB0aGF0Ljxicj4NCjxicj4NCiZndDsgaXRzIHNlaXNtaXNjIHByb2Nlc3NlZCBkYXRhLCBs YXJnZSB0ZXh0IGZpbGVzLjxicj4NCkkgc2VlLiBFeHRyZW1lbHkgZXhwZW5zaXZlIHRvIHJlcHJv ZHVjZS4uLiA8YnI+DQo8YnI+DQpJZiB5b3Uga25vdyB0aGUgZmlsZSBzdHJ1Y3R1cmUgYW5kIHRo ZSBtZXRhZGF0YSBpc24ndCBtdWNoIGluZXJlc3RpbmcsPGJyPg0KYSBzaW1wbGUgcGVybCBvciBw eXRob24gc2NyaXB0IGNhbiBzY3JhcCB0aGUgcmF3IGRldmljZSBmb3IgdGhlIGRhdGEuPGJyPg0K SSd2ZSBkb25lIGl0IGJlZm9yZS4gSSBjYW4gc2VuZCB5b3UgY29kZSBzbmlwcGV0cyBpZiB5b3Ug d2FudC48YnI+DQo8YnI+DQpEaWQgeW91IGhhdmUgYW55IHN1Y2Nlc3MgY29tcGlsaW5nIHhmc19p cmVjb3Zlcj88YnI+DQo8YnI+DQpJdCdzIGEgc2lkZSBub3RlIGJ1dCBvbmUgb2YgbXkgY3VzdG9t ZXJzIGlzIHNwZWNpYWxpc2VkIGluIHNlaXNtaWMgZGF0YTxicj4NCmFjcXVpc2l0aW9uLCBhbmQg cmVjb3JkIGV2ZXJ5IGRhdGEgdHdpY2Ugb24gdHdvIGRpZmZlcmVudCBSQUlELTE8YnI+DQpzeXN0 ZW1zIGFuZCBhbHdheXMga2VlcCBhdCBsZWFzdCB0d28gY29waWVzIG9mIGV2ZXJ5dGhpbmcsIHBs dXMgYW48YnI+DQpvbi10YXBlIGNvcHkuLi4gQSBjb21tb2RpdHkgMTZUQiBOQVMgY29zdHMgbXVj aCBsZXNzICgxMDAwMCDigqwgb3IgbGVzcyk8YnI+DQp0aGFuIHRoZSBkYXRhIGl0IGhvbGRzIGFu ZCBtYWtlcyBhIG5pY2UgYmFja3VwIHN5c3RlbS4gTk9USElORyByZXBsYWNlczxicj4NCmEgYmFj a3VwLiBZb3VyIHN5c3RlbSBXSUxMIGZhaWwgc29tZWRheSAod2VsbCBpdCBoYXMgbm93IGFwcGFy ZW50bHkpLjxicj4NCjxicj4NCi0tIDxicj4NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTxicj4NCkVtbWFudWVs IEZsb3JhYyAmbmJzcDsgJm5ic3A7IHwgJm5ic3A7IERpcmVjdGlvbiB0ZWNobmlxdWU8YnI+DQog Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAm bmJzcDsgJm5ic3A7fA0KJm5ic3A7IEludGVsbGlxdWU8YnI+DQogJm5ic3A7ICZuYnNwOyAmbmJz cDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7fA0KJm5i c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOw0KJmx0 O2VmbG9yYWNAaW50ZWxsaXF1ZS5jb20mZ3Q7PGJyPg0KICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwO3wNCiZuYnNwOyAr MzMgMSA3OCA5NCA4NCAwMjxicj4NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTxicj4NCjxicj4NCjwvZm9udD48 L3R0Pg0KPGJyPg0K --=_alternative 004384DFC1257746_=-- From thomas.forde@bergenofs.no Fri Jun 18 07:28:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.1 required=5.0 tests=BAYES_50,HTML_MESSAGE, 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 o5ICS8MQ223652 for ; Fri, 18 Jun 2010 07:28:09 -0500 X-ASG-Debug-ID: 1276864474-422001880000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from deframx28.softcom.dk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4051F159B239 for ; Fri, 18 Jun 2010 05:34:34 -0700 (PDT) Received: from deframx28.softcom.dk (deframx28.softcom.dk [87.230.83.86]) by cuda.sgi.com with ESMTP id lsyWZDuF04wgc6jy for ; Fri, 18 Jun 2010 05:34:34 -0700 (PDT) Received: (qmail 32186 invoked by uid 74); 18 Jun 2010 12:30:44 -0000 Received: from 74.82-134-78.bkkb.no (82.134.78.74) by deframx28.softcom.dk (envelope-from ) with ESMTP. tag msg.1276864244.453856.25327 (Processed in 0.183231 secs); 18 Jun 2010 12:30:44 -0000 X-SoftScan-Status: clean In-Reply-To: <20100618140028.05650928@harpe.intellique.com> References: <20100618132108.790921cf@harpe.intellique.com> <20100618133458.6640ce96@harpe.intellique.com> <20100618140028.05650928@harpe.intellique.com> To: Emmanuel Florac Cc: xfs@oss.sgi.com MIME-Version: 1.0 X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS X-KeepSent: 77BEDC85:715D16D2-C1257746:0043A985; type=4; name=$KeepSent X-Mailer: Lotus Notes Release 8.5.1 FP3 May 24, 2010 Message-ID: From: =?ISO-8859-1?Q?Thomas_F=F8rde?= Date: Fri, 18 Jun 2010 14:30:43 +0200 X-MIMETrack: Serialize by Router on LNBOS01/BOS(Release 8.5.1|September 28, 2009) at 18.06.2010 14:30:43, Serialize complete at 18.06.2010 14:30:43 Content-Type: multipart/alternative; boundary="=_alternative 0044BAFBC1257746_=" X-Barracuda-Connect: deframx28.softcom.dk[87.230.83.86] X-Barracuda-Start-Time: 1276864476 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32865 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multipart message in MIME format. --=_alternative 0044BAFBC1257746_= Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 dGhleSBoYXZlIGFsbCB0aGUgZGF0YSBpbiB0YXBlLCBidXQgbm90IHRoZSBwcm9jZXNzZWQgZGF0 YSwgc28gdGhhdCBoYXMgdG8gDQpiZSByZWRvbmUsIHdpbGwgdGFrZSBhYm91dCAgMTUtMzAgZGF5 cyB3b3JrIHRvIGdldCB1cGRhdGVkLg0KDQppbGwgc2VlIGlmIHdlIGNhbiByZWJ1aWxkIGEgZGlm ZmVyZW50IFNBTiB3aXRoIG1pcnJvciBmdW5jdGlvbmFsaXR5dCwgeSANCmhhdmUgMzg0eDMwMEdC IGRpc2sgaW4gbXkgU0FOLCBzbyBpdCBzaG91bGQgYmUgcG9zc2libGUuDQoNCg0KDQoNCg0KDQpT aW5jZXJlbHkNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0NClRob21hcyBGw7hyZGUgICAgSVQtTWFuYWdlciANCk1vYmls ZSArNDcgOTAgNDEgNDEgOTAgICBGYXggKzQ3IDU1IDMxIDY3IDY2DQp0aG9tYXMuZm9yZGVAYmVy Z2Vub2ZzLm5vICAgICB3d3cuYmVyZ2Vub2ZzLm5vDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpCZXJnZW4gT2lsZmll bGQgU2VydmljZXMgQVMNCkFkZHJlc3M6IE5lZHJlIEFhc3R2ZWl0IDEyICAgIE5PLTUxMDYgT3Zy ZSBFcnZpaw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpQbGVhc2UgY29uc2lkZXIgdGhlIGVudmlyb25tZW50IGJl Zm9yZSBwcmludGluZw0KDQoNCg0KRnJvbTogICBFbW1hbnVlbCBGbG9yYWMgPGVmbG9yYWNAaW50 ZWxsaXF1ZS5jb20+DQpUbzogICAgIFRob21hcyBGw7hyZGUgPHRob21hcy5mb3JkZUBiZXJnZW5v ZnMubm8+DQpDYzogICAgIHhmc0Bvc3Muc2dpLmNvbQ0KRGF0ZTogICAxOC4wNi4yMDEwIDE0OjAw DQpTdWJqZWN0OiAgICAgICAgUmU6IEhlbHAgd2l0aCBYRlMNCg0KDQoNCkxlIEZyaSwgMTggSnVu IDIwMTAgMTM6NDM6NTcgKzAyMDANClRob21hcyBGw7hyZGUgPHRob21hcy5mb3JkZUBiZXJnZW5v ZnMubm8+IMOpY3JpdmFpdDoNCg0KPiB0aGUgcmFpZCBhcnJheSBpcyBhIEZDIFNBTiBhcnJheSBj b25zaXN0aW5nIG9mIERTNDcwMCB1bml0IHdpdGgNCj4gRVhQODEwIGV4cGFuc2lvbiBzeXN0ZW0N Cj4gDQo+IHhmc19jaGVjayBmaXJzdCwgeGZzX3JlcGFpciAtbiwgYW5kIHhmc19yZXBhaXINCj4g DQo+IHhmc19SZXBhaXIgLUwgaGFzIG5vdCBiZWVuIHVzZWQuDQoNClRoYXQncyBmb3J0dW5hdGUs IG1heWJlIHNvbWV0aGluZyBjYW4gYmUgc2F2ZWQgZnJvbSB0aGF0Lg0KDQo+IGl0cyBzZWlzbWlz YyBwcm9jZXNzZWQgZGF0YSwgbGFyZ2UgdGV4dCBmaWxlcy4NCkkgc2VlLiBFeHRyZW1lbHkgZXhw ZW5zaXZlIHRvIHJlcHJvZHVjZS4uLiANCg0KSWYgeW91IGtub3cgdGhlIGZpbGUgc3RydWN0dXJl IGFuZCB0aGUgbWV0YWRhdGEgaXNuJ3QgbXVjaCBpbmVyZXN0aW5nLA0KYSBzaW1wbGUgcGVybCBv ciBweXRob24gc2NyaXB0IGNhbiBzY3JhcCB0aGUgcmF3IGRldmljZSBmb3IgdGhlIGRhdGEuDQpJ J3ZlIGRvbmUgaXQgYmVmb3JlLiBJIGNhbiBzZW5kIHlvdSBjb2RlIHNuaXBwZXRzIGlmIHlvdSB3 YW50Lg0KDQpEaWQgeW91IGhhdmUgYW55IHN1Y2Nlc3MgY29tcGlsaW5nIHhmc19pcmVjb3Zlcj8N Cg0KSXQncyBhIHNpZGUgbm90ZSBidXQgb25lIG9mIG15IGN1c3RvbWVycyBpcyBzcGVjaWFsaXNl ZCBpbiBzZWlzbWljIGRhdGENCmFjcXVpc2l0aW9uLCBhbmQgcmVjb3JkIGV2ZXJ5IGRhdGEgdHdp Y2Ugb24gdHdvIGRpZmZlcmVudCBSQUlELTENCnN5c3RlbXMgYW5kIGFsd2F5cyBrZWVwIGF0IGxl YXN0IHR3byBjb3BpZXMgb2YgZXZlcnl0aGluZywgcGx1cyBhbg0Kb24tdGFwZSBjb3B5Li4uIEEg Y29tbW9kaXR5IDE2VEIgTkFTIGNvc3RzIG11Y2ggbGVzcyAoMTAwMDAg4oKsIG9yIGxlc3MpDQp0 aGFuIHRoZSBkYXRhIGl0IGhvbGRzIGFuZCBtYWtlcyBhIG5pY2UgYmFja3VwIHN5c3RlbS4gTk9U SElORyByZXBsYWNlcw0KYSBiYWNrdXAuIFlvdXIgc3lzdGVtIFdJTEwgZmFpbCBzb21lZGF5ICh3 ZWxsIGl0IGhhcyBub3cgYXBwYXJlbnRseSkuDQoNCi0tIA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpFbW1h bnVlbCBGbG9yYWMgICAgIHwgICBEaXJlY3Rpb24gdGVjaG5pcXVlDQogICAgICAgICAgICAgICAg ICAgIHwgICBJbnRlbGxpcXVlDQogICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICA8ZWZs b3JhY0BpbnRlbGxpcXVlLmNvbT4NCiAgICAgICAgICAgICAgICAgICAgfCAgICszMyAxIDc4IDk0 IDg0IDAyDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KDQoNCg== --=_alternative 0044BAFBC1257746_= Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGZvbnQgc2l6ZT0yIGZhY2U9InNhbnMtc2VyaWYiPnRoZXkgaGF2ZSBhbGwgdGhlIGRhdGEgaW4g dGFwZSwgYnV0IG5vdA0KdGhlIHByb2Nlc3NlZCBkYXRhLCBzbyB0aGF0IGhhcyB0byBiZSByZWRv bmUsIHdpbGwgdGFrZSBhYm91dCAmbmJzcDsxNS0zMA0KZGF5cyB3b3JrIHRvIGdldCB1cGRhdGVk LjwvZm9udD4NCjxicj4NCjxicj48Zm9udCBzaXplPTIgZmFjZT0ic2Fucy1zZXJpZiI+aWxsIHNl ZSBpZiB3ZSBjYW4gcmVidWlsZCBhIGRpZmZlcmVudA0KU0FOIHdpdGggbWlycm9yIGZ1bmN0aW9u YWxpdHl0LCB5IGhhdmUgMzg0eDMwMEdCIGRpc2sgaW4gbXkgU0FOLCBzbyBpdA0Kc2hvdWxkIGJl IHBvc3NpYmxlLjwvZm9udD4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj48Zm9udCBzaXpl PTIgZmFjZT0ic2Fucy1zZXJpZiI+PGJyPg0KPGJyPg0KU2luY2VyZWx5PGJyPg0KLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LTxicj4NClRob21hcyBGw7hyZGUgJm5ic3A7ICZuYnNwO0lULU1hbmFnZXIgPGJyPg0KTW9iaWxl ICs0NyA5MCA0MSA0MSA5MCAmbmJzcDsgRmF4ICs0NyA1NSAzMSA2NyA2Njxicj4NCnRob21hcy5m b3JkZUBiZXJnZW5vZnMubm8gJm5ic3A7ICZuYnNwOyA8L2ZvbnQ+PGEgaHJlZj13d3cuYmVyZ2Vu b2ZzLm5vPjxmb250IHNpemU9MiBmYWNlPSJzYW5zLXNlcmlmIj53d3cuYmVyZ2Vub2ZzLm5vPC9m b250PjwvYT48Zm9udCBzaXplPTIgZmFjZT0ic2Fucy1zZXJpZiI+PGJyPg0KLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTxi cj4NCkJlcmdlbiBPaWxmaWVsZCBTZXJ2aWNlcyBBUzxicj4NCkFkZHJlc3M6IE5lZHJlIEFhc3R2 ZWl0IDEyICZuYnNwOyAmbmJzcDtOTy01MTA2IE92cmUgRXJ2aWs8YnI+DQotLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPGJy Pg0KPGJyPg0KUGxlYXNlIGNvbnNpZGVyIHRoZSBlbnZpcm9ubWVudCBiZWZvcmUgcHJpbnRpbmc8 L2ZvbnQ+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+PGZvbnQgc2l6ZT0xIGNvbG9yPSM1ZjVmNWYg ZmFjZT0ic2Fucy1zZXJpZiI+RnJvbTogJm5ic3A7ICZuYnNwOyAmbmJzcDsNCiZuYnNwOzwvZm9u dD48Zm9udCBzaXplPTEgZmFjZT0ic2Fucy1zZXJpZiI+RW1tYW51ZWwgRmxvcmFjICZsdDtlZmxv cmFjQGludGVsbGlxdWUuY29tJmd0OzwvZm9udD4NCjxicj48Zm9udCBzaXplPTEgY29sb3I9IzVm NWY1ZiBmYWNlPSJzYW5zLXNlcmlmIj5UbzogJm5ic3A7ICZuYnNwOyAmbmJzcDsNCiZuYnNwOzwv Zm9udD48Zm9udCBzaXplPTEgZmFjZT0ic2Fucy1zZXJpZiI+VGhvbWFzIEbDuHJkZSAmbHQ7dGhv bWFzLmZvcmRlQGJlcmdlbm9mcy5ubyZndDs8L2ZvbnQ+DQo8YnI+PGZvbnQgc2l6ZT0xIGNvbG9y PSM1ZjVmNWYgZmFjZT0ic2Fucy1zZXJpZiI+Q2M6ICZuYnNwOyAmbmJzcDsgJm5ic3A7DQombmJz cDs8L2ZvbnQ+PGZvbnQgc2l6ZT0xIGZhY2U9InNhbnMtc2VyaWYiPnhmc0Bvc3Muc2dpLmNvbTwv Zm9udD4NCjxicj48Zm9udCBzaXplPTEgY29sb3I9IzVmNWY1ZiBmYWNlPSJzYW5zLXNlcmlmIj5E YXRlOiAmbmJzcDsgJm5ic3A7ICZuYnNwOw0KJm5ic3A7PC9mb250Pjxmb250IHNpemU9MSBmYWNl PSJzYW5zLXNlcmlmIj4xOC4wNi4yMDEwIDE0OjAwPC9mb250Pg0KPGJyPjxmb250IHNpemU9MSBj b2xvcj0jNWY1ZjVmIGZhY2U9InNhbnMtc2VyaWYiPlN1YmplY3Q6ICZuYnNwOyAmbmJzcDsNCiZu YnNwOyAmbmJzcDs8L2ZvbnQ+PGZvbnQgc2l6ZT0xIGZhY2U9InNhbnMtc2VyaWYiPlJlOiBIZWxw IHdpdGgNClhGUzwvZm9udD4NCjxicj4NCjxociBub3NoYWRlPg0KPGJyPg0KPGJyPg0KPGJyPjx0 dD48Zm9udCBzaXplPTI+TGUgRnJpLCAxOCBKdW4gMjAxMCAxMzo0Mzo1NyArMDIwMDxicj4NClRo b21hcyBGw7hyZGUgJmx0O3Rob21hcy5mb3JkZUBiZXJnZW5vZnMubm8mZ3Q7IMOpY3JpdmFpdDo8 YnI+DQo8YnI+DQomZ3Q7IHRoZSByYWlkIGFycmF5IGlzIGEgRkMgU0FOIGFycmF5IGNvbnNpc3Rp bmcgb2YgRFM0NzAwIHVuaXQgd2l0aDxicj4NCiZndDsgRVhQODEwIGV4cGFuc2lvbiBzeXN0ZW08 YnI+DQomZ3Q7IDxicj4NCiZndDsgeGZzX2NoZWNrIGZpcnN0LCB4ZnNfcmVwYWlyIC1uLCBhbmQg eGZzX3JlcGFpcjxicj4NCiZndDsgPGJyPg0KJmd0OyB4ZnNfUmVwYWlyIC1MIGhhcyBub3QgYmVl biB1c2VkLjxicj4NCjxicj4NClRoYXQncyBmb3J0dW5hdGUsIG1heWJlIHNvbWV0aGluZyBjYW4g YmUgc2F2ZWQgZnJvbSB0aGF0Ljxicj4NCjxicj4NCiZndDsgaXRzIHNlaXNtaXNjIHByb2Nlc3Nl ZCBkYXRhLCBsYXJnZSB0ZXh0IGZpbGVzLjxicj4NCkkgc2VlLiBFeHRyZW1lbHkgZXhwZW5zaXZl IHRvIHJlcHJvZHVjZS4uLiA8YnI+DQo8YnI+DQpJZiB5b3Uga25vdyB0aGUgZmlsZSBzdHJ1Y3R1 cmUgYW5kIHRoZSBtZXRhZGF0YSBpc24ndCBtdWNoIGluZXJlc3RpbmcsPGJyPg0KYSBzaW1wbGUg cGVybCBvciBweXRob24gc2NyaXB0IGNhbiBzY3JhcCB0aGUgcmF3IGRldmljZSBmb3IgdGhlIGRh dGEuPGJyPg0KSSd2ZSBkb25lIGl0IGJlZm9yZS4gSSBjYW4gc2VuZCB5b3UgY29kZSBzbmlwcGV0 cyBpZiB5b3Ugd2FudC48YnI+DQo8YnI+DQpEaWQgeW91IGhhdmUgYW55IHN1Y2Nlc3MgY29tcGls aW5nIHhmc19pcmVjb3Zlcj88YnI+DQo8YnI+DQpJdCdzIGEgc2lkZSBub3RlIGJ1dCBvbmUgb2Yg bXkgY3VzdG9tZXJzIGlzIHNwZWNpYWxpc2VkIGluIHNlaXNtaWMgZGF0YTxicj4NCmFjcXVpc2l0 aW9uLCBhbmQgcmVjb3JkIGV2ZXJ5IGRhdGEgdHdpY2Ugb24gdHdvIGRpZmZlcmVudCBSQUlELTE8 YnI+DQpzeXN0ZW1zIGFuZCBhbHdheXMga2VlcCBhdCBsZWFzdCB0d28gY29waWVzIG9mIGV2ZXJ5 dGhpbmcsIHBsdXMgYW48YnI+DQpvbi10YXBlIGNvcHkuLi4gQSBjb21tb2RpdHkgMTZUQiBOQVMg Y29zdHMgbXVjaCBsZXNzICgxMDAwMCDigqwgb3IgbGVzcyk8YnI+DQp0aGFuIHRoZSBkYXRhIGl0 IGhvbGRzIGFuZCBtYWtlcyBhIG5pY2UgYmFja3VwIHN5c3RlbS4gTk9USElORyByZXBsYWNlczxi cj4NCmEgYmFja3VwLiBZb3VyIHN5c3RlbSBXSUxMIGZhaWwgc29tZWRheSAod2VsbCBpdCBoYXMg bm93IGFwcGFyZW50bHkpLjxicj4NCjxicj4NCi0tIDxicj4NCi0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTxicj4N CkVtbWFudWVsIEZsb3JhYyAmbmJzcDsgJm5ic3A7IHwgJm5ic3A7IERpcmVjdGlvbiB0ZWNobmlx dWU8YnI+DQogJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7 ICZuYnNwOyAmbmJzcDsgJm5ic3A7fA0KJm5ic3A7IEludGVsbGlxdWU8YnI+DQogJm5ic3A7ICZu YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i c3A7fA0KJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu YnNwOw0KJmx0O2VmbG9yYWNAaW50ZWxsaXF1ZS5jb20mZ3Q7PGJyPg0KICZuYnNwOyAmbmJzcDsg Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwO3wN CiZuYnNwOyArMzMgMSA3OCA5NCA4NCAwMjxicj4NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTxicj4NCjxicj4N CjwvZm9udD48L3R0Pg0KPGJyPg0K --=_alternative 0044BAFBC1257746_=-- From andi@firstfloor.org Fri Jun 18 07:45:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5ICjHfR224358 for ; Fri, 18 Jun 2010 07:45:18 -0500 X-ASG-Debug-ID: 1276865275-7fe500310000-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 BFB5814FD752 for ; Fri, 18 Jun 2010 05:47:55 -0700 (PDT) Received: from one.firstfloor.org (one.firstfloor.org [213.235.205.2]) by cuda.sgi.com with ESMTP id 2OUJA94jgudBfvE5 for ; Fri, 18 Jun 2010 05:47:55 -0700 (PDT) Received: from basil.firstfloor.org (p5B3CB38E.dip0.t-ipconnect.de [91.60.179.142]) by one.firstfloor.org (Postfix) with ESMTP id 668231A980C3; Fri, 18 Jun 2010 14:47:53 +0200 (CEST) Received: by basil.firstfloor.org (Postfix, from userid 1000) id D0A2EB1A2C; Fri, 18 Jun 2010 14:47:52 +0200 (CEST) To: Thomas =?iso-8859-1?Q?F=F8rde?= Cc: Emmanuel Florac , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS From: Andi Kleen References: <20100618132108.790921cf@harpe.intellique.com> <20100618133458.6640ce96@harpe.intellique.com> Date: Fri, 18 Jun 2010 14:47:52 +0200 In-Reply-To: ("Thomas =?iso-8859-1?Q?F=F8rde=22's?= message of "Fri\, 18 Jun 2010 13\:43\:57 +0200") Message-ID: <87iq5gv75z.fsf@basil.nowhere.org> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: one.firstfloor.org[213.235.205.2] X-Barracuda-Start-Time: 1276865275 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32866 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Thomas Førde writes: > the raid array is a FC SAN array consisting of DS4700 unit with EXP810 > expansion system > > xfs_check first, xfs_repair -n, and xfs_repair > > xfs_Repair -L has not been used. > > its seismisc processed data, large text files. I've seen people get text files (source files) back with strings /dev/... If you're lucky it's mostly continous and large and not too hard to sort out. But definitely backups are a good idea next time. RAID is no replacement for backups. -Andi -- ak@linux.intel.com -- Speaking for myself only. From eflorac@intellique.com Fri Jun 18 07:45: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.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5ICjlVI224381 for ; Fri, 18 Jun 2010 07:45:47 -0500 X-ASG-Debug-ID: 1276865300-7ce702ea0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9F6943E4A03 for ; Fri, 18 Jun 2010 05:48:23 -0700 (PDT) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id 0XXsmOuH6v4RkwdC for ; Fri, 18 Jun 2010 05:48:23 -0700 (PDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id 4D28C4C80A3; Fri, 18 Jun 2010 14:48:16 +0200 (CEST) Date: Fri, 18 Jun 2010 14:48:21 +0200 From: Emmanuel Florac To: Thomas =?ISO-8859-1?Q?F=F8rde?= Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS Message-ID: <20100618144821.0cab4bd4@harpe.intellique.com> In-Reply-To: References: <20100618132108.790921cf@harpe.intellique.com> <20100618133458.6640ce96@harpe.intellique.com> <20100618140028.05650928@harpe.intellique.com> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1276865305 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32866 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Fri, 18 Jun 2010 14:30:43 +0200 Thomas F=F8rde =E9crivait: > ill see if we can rebuild a different SAN with mirror functionalityt, > y have 384x300GB disk in my SAN, so it should be possible. No, a mirror will corrupt your data as well, a simple copy is better; unless you break the mirror as soon as the data is on it, to keep a copy safe. But the copy has another benefit, it's a different filesystem too. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From stan@hardwarefreak.com Fri Jun 18 07:52:39 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5ICqcfI224571 for ; Fri, 18 Jun 2010 07:52:38 -0500 X-ASG-Debug-ID: 1276865945-422702650000-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 EDB0610F59EF for ; Fri, 18 Jun 2010 05:59:05 -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 ULN94uzAL68spxGL for ; Fri, 18 Jun 2010 05:59:05 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 495FB6C3CF for ; Fri, 18 Jun 2010 07:55:15 -0500 (CDT) Message-ID: <4C1B6CB2.1020406@hardwarefreak.com> Date: Fri, 18 Jun 2010 07:55:14 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS References: <20100618132108.790921cf@harpe.intellique.com> <20100618133458.6640ce96@harpe.intellique.com> <20100618140028.05650928@harpe.intellique.com> In-Reply-To: <20100618140028.05650928@harpe.intellique.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1276865945 X-Barracuda-Bayes: INNOCENT GLOBAL 0.3914 1.0000 -0.0225 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.58 X-Barracuda-Spam-Status: No, SCORE=0.58 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.32867 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Emmanuel Florac put forth on 6/18/2010 7:00 AM: > A commodity 16TB NAS costs much less (10000 € or less) > than the data it holds and makes a nice backup system. NOTHING replaces > a backup. Your system WILL fail someday (well it has now apparently). Since he already has a FC SAN, going with something like a 4Gb FC Nexsan Sataboy w/16 1TB drives would be a better option. Pricing should be around $10-12k USD. I bought an 8x500GB drive 2Gb FC Satablade back in 2006 for approximately $9k USD because expanding our IBM FasTt 600 would have cost over $20K USD for 1/4th the additional storage of thh Nexsan (the FasTt 600 wasn't compatible with the EXP810, so the only expansion option was adding another FC tray with 14x73GB 15k FC disks). As long as the OP has a free SFP LC port on his FC switch (and the ability to program zones) this is definitely the way to go. No NFS/CIFS overhead. And given the default 1GB cache on the Sataboy, it'll likely have better performance than the DS4700/EXP810 combo (at half the cost). The web GUI admin interface makes setting up and managing the Nexsan units a breeze. I've been really happy with ours, and with Nexsan support. Great products, great company. http://www.nexsan.com/sataboy.php -- Stan From stan@hardwarefreak.com Fri Jun 18 07:58: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 (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5ICwDZK224705 for ; Fri, 18 Jun 2010 07:58:14 -0500 X-ASG-Debug-ID: 1276866051-309303b30000-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 06A6514FFDB9 for ; Fri, 18 Jun 2010 06:00:51 -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 4ebDtLc3HkirCjDO for ; Fri, 18 Jun 2010 06:00:51 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 8AD706C072 for ; Fri, 18 Jun 2010 08:00:51 -0500 (CDT) Message-ID: <4C1B6E02.3010503@hardwarefreak.com> Date: Fri, 18 Jun 2010 08:00:50 -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: Help with XFS Subject: Re: Help with XFS References: <20100618132108.790921cf@harpe.intellique.com> <20100618133458.6640ce96@harpe.intellique.com> <20100618140028.05650928@harpe.intellique.com> In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1276866052 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0003 1.0000 -2.0188 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.32868 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 Thomas Førde put forth on 6/18/2010 7:30 AM: > they have all the data in tape, but not the processed data, so that has to > be redone, will take about 15-30 days work to get updated. > > ill see if we can rebuild a different SAN with mirror functionalityt, y > have 384x300GB disk in my SAN, so it should be possible. Heheh. Well, scratch my Nexsan recommendation then. With that much free space on your SAN arrays, one wonders why you didn't already have some kind of tar'd or other backup of the processed data... -- Stan From eflorac@intellique.com Fri Jun 18 08:06: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.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5ID6ErS224958 for ; Fri, 18 Jun 2010 08:06:14 -0500 X-ASG-Debug-ID: 1276866527-3832039b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D239315004D4 for ; Fri, 18 Jun 2010 06:08:50 -0700 (PDT) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id 8XNWvApL4KtZQiZE for ; Fri, 18 Jun 2010 06:08:50 -0700 (PDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id 758C64C80CC; Fri, 18 Jun 2010 15:08:43 +0200 (CEST) Date: Fri, 18 Jun 2010 15:08:48 +0200 From: Emmanuel Florac To: Thomas =?ISO-8859-1?Q?F=F8rde?= Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS Message-ID: <20100618150848.289428ed@harpe.intellique.com> In-Reply-To: References: <20100618132108.790921cf@harpe.intellique.com> <20100618133458.6640ce96@harpe.intellique.com> <20100618140028.05650928@harpe.intellique.com> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1276866532 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32868 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Fri, 18 Jun 2010 14:17:29 +0200 Thomas F=F8rde =E9crivait: > got the libXH installed and compiled, but get a shared.22 error file > does not exist trying to run it. >=20 Trying to run what? Apparently I can't compile hxtools with hxlib v1 nor version 3, only v2 would work apparently... --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From thomas.forde@bergenofs.no Fri Jun 18 08:33: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=4.1 required=5.0 tests=BAYES_50,HTML_MESSAGE, 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 o5IDX5tU226043 for ; Fri, 18 Jun 2010 08:33:05 -0500 X-ASG-Debug-ID: 1276868370-5d2e03910000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from deframx28.softcom.dk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 52109159C541 for ; Fri, 18 Jun 2010 06:39:31 -0700 (PDT) Received: from deframx28.softcom.dk (deframx28.softcom.dk [87.230.83.86]) by cuda.sgi.com with ESMTP id oVrKnOYqpoTECLZ1 for ; Fri, 18 Jun 2010 06:39:31 -0700 (PDT) Received: (qmail 7553 invoked by uid 74); 18 Jun 2010 13:35:40 -0000 Received: from 74.82-134-78.bkkb.no (82.134.78.74) by deframx28.softcom.dk (envelope-from ) with ESMTP. tag msg.1276868140.498143.22015 (Processed in 0.193953 secs); 18 Jun 2010 13:35:40 -0000 X-SoftScan-Status: clean In-Reply-To: <20100618150848.289428ed@harpe.intellique.com> References: <20100618132108.790921cf@harpe.intellique.com> <20100618133458.6640ce96@harpe.intellique.com> <20100618140028.05650928@harpe.intellique.com> <20100618150848.289428ed@harpe.intellique.com> To: Emmanuel Florac Cc: xfs@oss.sgi.com MIME-Version: 1.0 X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS X-KeepSent: 752A728E:086B0B19-C1257746:00484C47; type=4; name=$KeepSent X-Mailer: Lotus Notes Release 8.5.1 FP3 May 24, 2010 Message-ID: From: =?ISO-8859-1?Q?Thomas_F=F8rde?= Date: Fri, 18 Jun 2010 15:35:39 +0200 X-MIMETrack: Serialize by Router on LNBOS01/BOS(Release 8.5.1|September 28, 2009) at 18.06.2010 15:35:39, Serialize complete at 18.06.2010 15:35:39 Content-Type: multipart/alternative; boundary="=_alternative 004AACECC1257746_=" X-Barracuda-Connect: deframx28.softcom.dk[87.230.83.86] X-Barracuda-Start-Time: 1276868372 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0010 1.0000 -2.0146 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=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32871 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multipart message in MIME format. --=_alternative 004AACECC1257746_= Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: quoted-printable testrun of xfs=5Firecover error while loading shard libraries: libHX.so.22, cannot open shared=20 object file, no such file or directory. prolly some libs at the wrong place point elsewhere. Sincerely ------------------------------------------------------------------- Thomas F=F8rde IT-Manager=20 Mobile +47 90 41 41 90 Fax +47 55 31 67 66 thomas.forde@bergenofs.no www.bergenofs.no ------------------------------------------------------------------- Bergen Oilfield Services AS Address: Nedre Aastveit 12 NO-5106 Ovre Ervik ------------------------------------------------------------------- Please consider the environment before printing From: Emmanuel Florac To: Thomas F=F8rde Cc: xfs@oss.sgi.com Date: 18.06.2010 15:08 Subject: Re: Help with XFS Le Fri, 18 Jun 2010 14:17:29 +0200 Thomas F=F8rde =E9crivait: > got the libXH installed and compiled, but get a shared.22 error file > does not exist trying to run it. >=20 Trying to run what? Apparently I can't compile hxtools with hxlib v1 nor version 3, only v2 would work apparently... --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ --=_alternative 004AACECC1257746_= Content-Type: text/html; charset="ISO-8859-1" Content-Transfer-Encoding: quoted-printable testrun of xfs=5Firecover


error while loading shard libraries: libHX.so.22, cannot open shared object file, no such file or directory.

prolly some libs at the wrong place point elsewhere.


Sincerely
-------------------------------------------------------------------
Thomas F=F8rde    IT-Manager
Mobile +47 90 41 41 90   Fax +47 55 31 67 66
thomas.forde@bergenofs.no    
<= font size=3D2 face=3D"sans-serif">www.bergenofs.no

-------------------------------------------------------------------
Bergen Oilfield Services AS
Address: Nedre Aastveit 12    NO-5106 Ovre Ervik
-------------------------------------------------------------------

Please consider the environment before printing




From:     =    Emmanuel Florac <eflorac= @intellique.com>
To:     &n= bsp;  Thomas F=F8rde <thomas.f= orde@bergenofs.no>
Cc:     &n= bsp;  xfs@oss.sgi.com
Date:     =    18.06.2010 15:08
Subject:   &nbs= p;    Re: Help with XFS




Le Fri, 18 Jun 2010 14:17:29 +0200
Thomas F=F8rde <thomas.forde@bergenofs.no> =E9crivait:

> got the libXH installed and compiled, but get a shared.22 error file > does not exist trying to run it.
>

Trying to run what? Apparently I can't compile hxtools with hxlib v1
nor version 3, only v2 would work apparently...

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


--=_alternative 004AACECC1257746_=-- From eflorac@intellique.com Fri Jun 18 08:59:18 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5IDxIcB226933 for ; Fri, 18 Jun 2010 08:59:18 -0500 X-ASG-Debug-ID: 1276869711-4cf5038c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 17F833E3855 for ; Fri, 18 Jun 2010 07:01:54 -0700 (PDT) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id 6lJvb0ibdjfQR1SY for ; Fri, 18 Jun 2010 07:01:54 -0700 (PDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id 5CA264C8186; Fri, 18 Jun 2010 16:01:47 +0200 (CEST) Date: Fri, 18 Jun 2010 16:01:52 +0200 From: Emmanuel Florac To: Thomas =?ISO-8859-1?Q?F=F8rde?= Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS Message-ID: <20100618160152.77dfb143@harpe.intellique.com> In-Reply-To: References: <20100618132108.790921cf@harpe.intellique.com> <20100618133458.6640ce96@harpe.intellique.com> <20100618140028.05650928@harpe.intellique.com> <20100618150848.289428ed@harpe.intellique.com> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1276869717 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32872 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Fri, 18 Jun 2010 15:35:39 +0200 Thomas F=F8rde =E9crivait: > testrun of xfs_irecover >=20 >=20 > error while loading shard libraries: libHX.so.22, cannot open shared=20 > object file, no such file or directory. >=20 > prolly some libs at the wrong place point elsewhere. >=20 What version of libhx did you install and how? I've finally managed to compile xfs_irecover by using libhx18. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From eflorac@intellique.com Fri Jun 18 09:01: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 (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5IE1agq227037 for ; Fri, 18 Jun 2010 09:01:36 -0500 X-ASG-Debug-ID: 1276869848-212d026e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B854A14F7B3B for ; Fri, 18 Jun 2010 07:04:12 -0700 (PDT) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id 2SSaiwiJAwtPUJKW for ; Fri, 18 Jun 2010 07:04:12 -0700 (PDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id 2352F4C8113; Fri, 18 Jun 2010 16:04:04 +0200 (CEST) Date: Fri, 18 Jun 2010 16:04:10 +0200 From: Emmanuel Florac To: Stan Hoeppner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS Message-ID: <20100618160410.034bc72f@harpe.intellique.com> In-Reply-To: <4C1B6CB2.1020406@hardwarefreak.com> References: <20100618132108.790921cf@harpe.intellique.com> <20100618133458.6640ce96@harpe.intellique.com> <20100618140028.05650928@harpe.intellique.com> <4C1B6CB2.1020406@hardwarefreak.com> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1276869854 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32872 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Fri, 18 Jun 2010 07:55:14 -0500 Stan Hoeppner =E9crivait: > Since he already has a FC SAN, going with something like a 4Gb FC > Nexsan Sataboy w/16 1TB drives would be a better option.=20 Why not, actually anything that could hold a backup will do :) --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From stan@hardwarefreak.com Fri Jun 18 10:35: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 o5IFZcAn229950 for ; Fri, 18 Jun 2010 10:35:39 -0500 X-ASG-Debug-ID: 1276875495-29fb02a50000-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 502123E5286 for ; Fri, 18 Jun 2010 08:38:16 -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 AsJ1vrk0MmRpS3ib for ; Fri, 18 Jun 2010 08:38:16 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id AF5BE6C3A0 for ; Fri, 18 Jun 2010 10:38:15 -0500 (CDT) Message-ID: <4C1B92E7.1050900@hardwarefreak.com> Date: Fri, 18 Jun 2010 10:38:15 -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: Help with XFS -- use DS4700 Volume Copy feature for backing up the seismic date LUN Subject: Re: Help with XFS -- use DS4700 Volume Copy feature for backing up the seismic date LUN References: <20100618132108.790921cf@harpe.intellique.com> <20100618133458.6640ce96@harpe.intellique.com> <20100618140028.05650928@harpe.intellique.com> <4C1B6CB2.1020406@hardwarefreak.com> <20100618160410.034bc72f@harpe.intellique.com> In-Reply-To: <20100618160410.034bc72f@harpe.intellique.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1276875496 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0912 1.0000 -1.4459 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.85 X-Barracuda-Spam-Status: No, SCORE=-0.85 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32878 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Emmanuel Florac put forth on 6/18/2010 9:04 AM: > Le Fri, 18 Jun 2010 07:55:14 -0500 > Stan Hoeppner écrivait: > >> Since he already has a FC SAN, going with something like a 4Gb FC >> Nexsan Sataboy w/16 1TB drives would be a better option. > > Why not, actually anything that could hold a backup will do :) That really depends on the size of one's filesystem(s) to be backed up and the required backup schedule. Backup times, optimal configurations: 10TB FS 20TB FS 40TB FS 4Gb FC 7 hours 14 hours 28 hours 1GbE NFS 28 hours 56 hours 111 hours With 4Gb FC one could backup 40TB in just over a day. Using a 1GbE NAS filer it would take 4.6 days, almost an entire standard business _week_. Now, depending on the data, one could always tar the FS with compression and substantially decrease these wire xfer times with either FC or NAS, which most OPs would probably do with given the FS sizes involved. And this is where the really nice high end arrays start to be worth their price tag. Even some upper midrange arrays, both SAN and NAS, have PIT snapshot and LUN mirroring backup capabilities. Both operations are much faster than a filesystem level backup over the wire. The DS4700 offers both a PIT snapshot feature called "FlashCopy" and a LUN mirroring feature called "Volume Copy". It would seem in the OP's case that making use of the DS4700's Volume Copy feature would be of great benefit. He would simply make a Volume Copy of the current LUN holding the processed seismic data using the System Storage DS4000 Storage Manager software. He should be able to schedule this operation to occur nightly, every other day, weekly, biweekly, etc, or he could just run it manually occasionally if the dataset doesn't change after it's been processed. Again, given the OP's SAN hardware, this is really the only way to fly in this case. -- Stan From michael.monnerie@is.it-management.at Fri Jun 18 11:40: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 o5IGeSs7232425 for ; Fri, 18 Jun 2010 11:40:28 -0500 X-ASG-Debug-ID: 1276879614-0f2d03d60000-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 E2C99159CB7B for ; Fri, 18 Jun 2010 09:46:54 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id hQe57fCvWPLkk2C3 for ; Fri, 18 Jun 2010 09:46:54 -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 9072B17A for ; Fri, 18 Jun 2010 18:43: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 73ED483C829 for ; Fri, 18 Jun 2010 18:42:47 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS Date: Fri, 18 Jun 2010 18:43:01 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) References: <20100618133458.6640ce96@harpe.intellique.com> In-Reply-To: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1462525.cFiZO1zcsj"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201006181843.01755@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1276879615 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0027 1.0000 -2.0035 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.00 X-Barracuda-Spam-Status: No, SCORE=-2.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32883 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart1462525.cFiZO1zcsj Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable On Freitag, 18. Juni 2010 Thomas F=C3=B8rde wrote: > the raid array is a FC SAN array consisting of DS4700 unit with > EXP810 expansion system =20 You have the money for a IBM DS4700 (costs with disk >15.000=E2=82=AC), but= not=20 for 4 cheap 2TB SATA disks to at least copy the data there? That would=20 have cost <500=E2=82=AC. =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/ --nextPart1462525.cFiZO1zcsj 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) iEYEABECAAYFAkwbohUACgkQzhSR9xwSCbRJmwCbBTrf+Q2Yaw6izc8IF6ua3Zyn Ra8AnjDqsBRRyQv3hNBBq38ruWsN0s0x =SHVS -----END PGP SIGNATURE----- --nextPart1462525.cFiZO1zcsj-- From eflorac@intellique.com Fri Jun 18 11:50:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5IGo14s232767 for ; Fri, 18 Jun 2010 11:50:01 -0500 X-ASG-Debug-ID: 1276879952-51dc033f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C41623E5727 for ; Fri, 18 Jun 2010 09:52:36 -0700 (PDT) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id FRR9BFEFsTlVuswZ for ; Fri, 18 Jun 2010 09:52:36 -0700 (PDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id EB7F34C808C; Fri, 18 Jun 2010 18:52:28 +0200 (CEST) Date: Fri, 18 Jun 2010 18:52:23 +0200 From: Emmanuel Florac To: Michael Monnerie Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS Message-ID: <20100618185223.60119f36@harpe.intellique.com> In-Reply-To: <201006181843.01755@zmi.at> References: <20100618133458.6640ce96@harpe.intellique.com> <201006181843.01755@zmi.at> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/signed; micalg=PGP-SHA1; boundary="Sig_/M_spYOqWB3uW3Ax0K5TwS89"; protocol="application/pgp-signature" X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1276879958 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32884 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --Sig_/M_spYOqWB3uW3Ax0K5TwS89 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Le Fri, 18 Jun 2010 18:43:01 +0200 Michael Monnerie =C3=A9crivait: > =20 > You have the money for a IBM DS4700 (costs with disk >15.000=E2=82=AC), b= ut > not for 4 cheap 2TB SATA disks to at least copy the data there? That > would have cost <500=E2=82=AC. This isn't very helpful. Advice to everyone : read the tao of backup ( http://www.taobackup.com ). Old, funny and still right on. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ --Sig_/M_spYOqWB3uW3Ax0K5TwS89 Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux) iEYEARECAAYFAkwbpEgACgkQX3jQXNUicVZ3gwCgw3lJm5bD1q1E5f4KDlof9QEt ILkAoPVN+FLUscWZYtDNA2CBdPvsmx1q =jY++ -----END PGP SIGNATURE----- --Sig_/M_spYOqWB3uW3Ax0K5TwS89-- From stan@hardwarefreak.com Fri Jun 18 12:18:37 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5IHIbFB233639 for ; Fri, 18 Jun 2010 12:18:37 -0500 X-ASG-Debug-ID: 1276881905-508e02220000-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 07106159D3D5 for ; Fri, 18 Jun 2010 10:25:05 -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 17chEHKPKZn5MMYR for ; Fri, 18 Jun 2010 10:25:05 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 654D26C072 for ; Fri, 18 Jun 2010 12:21:14 -0500 (CDT) Message-ID: <4C1BAB09.4010801@hardwarefreak.com> Date: Fri, 18 Jun 2010 12:21:13 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.10) Gecko/20100512 Thunderbird/3.0.5 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS References: <20100618133458.6640ce96@harpe.intellique.com> <201006181843.01755@zmi.at> In-Reply-To: <201006181843.01755@zmi.at> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1276881906 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0950 1.0000 -1.4228 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.82 X-Barracuda-Spam-Status: No, SCORE=-0.82 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.32885 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 Monnerie put forth on 6/18/2010 11:43 AM: > On Freitag, 18. Juni 2010 Thomas Førde wrote: >> the raid array is a FC SAN array consisting of DS4700 unit with >> EXP810 expansion system > > You have the money for a IBM DS4700 (costs with disk >15.000€), but not > for 4 cheap 2TB SATA disks to at least copy the data there? That would > have cost <500€. I'm guessing the OP works for a petroleum company, given the seismic data. Either that or a government agency studying volcanism. He states their DS4700 system(s) (a single DS4700 is limited to 112 drives) have 384x300GB drives. That setup would cost at least $250k USD at IBM list price, probably more given the number of drives. Money isn't the issue here. Lack of planning and procedure seems to be the issue. -- Stan From thomas.forde@bergenofs.no Fri Jun 18 13:48:16 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.1 required=5.0 tests=BAYES_50,HTML_MESSAGE, 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 o5IImFB7236279 for ; Fri, 18 Jun 2010 13:48:15 -0500 X-ASG-Debug-ID: 1276887282-09e002a30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from deframx28.softcom.dk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3C098B1EB8D for ; Fri, 18 Jun 2010 11:54:43 -0700 (PDT) Received: from deframx28.softcom.dk (deframx28.softcom.dk [87.230.83.86]) by cuda.sgi.com with ESMTP id N86G9mAHiQKBJ9VM for ; Fri, 18 Jun 2010 11:54:43 -0700 (PDT) Received: (qmail 29457 invoked by uid 74); 18 Jun 2010 18:50:51 -0000 Received: from 74.82-134-78.bkkb.no (82.134.78.74) by deframx28.softcom.dk (envelope-from ) with ESMTP. tag msg.1276887051.117786.9933 (Processed in 0.195058 secs); 18 Jun 2010 18:50:51 -0000 X-SoftScan-Status: clean In-Reply-To: <20100618160152.77dfb143@harpe.intellique.com> References: <20100618132108.790921cf@harpe.intellique.com> <20100618133458.6640ce96@harpe.intellique.com> <20100618140028.05650928@harpe.intellique.com> <20100618150848.289428ed@harpe.intellique.com> <20100618160152.77dfb143@harpe.intellique.com> To: Emmanuel Florac Cc: xfs@oss.sgi.com MIME-Version: 1.0 X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS X-KeepSent: 2D06E1CF:A343BBE3-C1257746:00677C57; type=4; name=$KeepSent X-Mailer: Lotus Notes Release 8.5.1 FP3 May 24, 2010 From: =?ISO-8859-1?Q?Thomas_F=F8rde?= Message-ID: Date: Fri, 18 Jun 2010 20:50:49 +0200 X-MIMETrack: Serialize by Router on LNBOS01/BOS(Release 8.5.1|September 28, 2009) at 18.06.2010 20:50:50, Serialize complete at 18.06.2010 20:50:50 Content-Type: multipart/alternative; boundary="=_alternative 0067879AC1257746_=" X-Barracuda-Connect: deframx28.softcom.dk[87.230.83.86] X-Barracuda-Start-Time: 1276887284 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32891 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multipart message in MIME format. --=_alternative 0067879AC1257746_= Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: quoted-printable when i compiled it i used libHX 3.4 as thats why the xfs=5Firecover=20 ./configure demanded. Sincerely ------------------------------------------------------------------- Thomas F=F8rde IT-Manager=20 Mobile +47 90 41 41 90 Fax +47 55 31 67 66 thomas.forde@bergenofs.no www.bergenofs.no ------------------------------------------------------------------- Bergen Oilfield Services AS Address: Nedre Aastveit 12 NO-5106 Ovre Ervik ------------------------------------------------------------------- Please consider the environment before printing From: Emmanuel Florac To: Thomas F=F8rde Cc: xfs@oss.sgi.com Date: 18.06.2010 16:01 Subject: Re: Help with XFS Le Fri, 18 Jun 2010 15:35:39 +0200 Thomas F=F8rde =E9crivait: > testrun of xfs=5Firecover >=20 >=20 > error while loading shard libraries: libHX.so.22, cannot open shared=20 > object file, no such file or directory. >=20 > prolly some libs at the wrong place point elsewhere. >=20 What version of libhx did you install and how? I've finally managed to compile xfs=5Firecover by using libhx18. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ --=_alternative 0067879AC1257746_= Content-Type: text/html; charset="ISO-8859-1" Content-Transfer-Encoding: quoted-printable when i compiled it i used libHX 3.4 as thats why the xfs=5Firecover ./configure demanded.


Sincerely
-------------------------------------------------------------------
Thomas F=F8rde    IT-Manager
Mobile +47 90 41 41 90   Fax +47 55 31 67 66
thomas.forde@bergenofs.no    
<= font size=3D2 face=3D"sans-serif">www.bergenofs.no

-------------------------------------------------------------------
Bergen Oilfield Services AS
Address: Nedre Aastveit 12    NO-5106 Ovre Ervik
-------------------------------------------------------------------

Please consider the environment before printing




From:     =    Emmanuel Florac <eflorac= @intellique.com>
To:     &n= bsp;  Thomas F=F8rde <thomas.f= orde@bergenofs.no>
Cc:     &n= bsp;  xfs@oss.sgi.com
Date:     =    18.06.2010 16:01
Subject:   &nbs= p;    Re: Help with XFS




Le Fri, 18 Jun 2010 15:35:39 +0200
Thomas F=F8rde <thomas.forde@bergenofs.no> =E9crivait:

> testrun of xfs=5Firecover
>
>
> error while loading shard libraries: libHX.so.22, cannot open shared
> object file, no such file or directory.
>
> prolly some libs at the wrong place point elsewhere.
>

What version of libhx did you install and how? I've finally managed to
compile xfs=5Firecover by using libhx18.

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


--=_alternative 0067879AC1257746_=-- From eflorac@intellique.com Fri Jun 18 15:55: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.6 required=5.0 tests=BAYES_00,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5IKt7C8239631 for ; Fri, 18 Jun 2010 15:55:07 -0500 X-ASG-Debug-ID: 1276894660-09df022a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 256423E65FB for ; Fri, 18 Jun 2010 13:57:43 -0700 (PDT) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id bHhQgGz1mqyDyBc2 for ; Fri, 18 Jun 2010 13:57:43 -0700 (PDT) Received: from galadriel.home (pla78-1-82-235-234-79.fbx.proxad.net [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id 09A378180A3; Fri, 18 Jun 2010 22:57:35 +0200 (CEST) Date: Fri, 18 Jun 2010 22:57:12 +0200 From: Emmanuel Florac To: Thomas =?ISO-8859-1?Q?F=F8rde?= Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS Message-ID: <20100618225712.2d2794f7@galadriel.home> In-Reply-To: References: <20100618132108.790921cf@harpe.intellique.com> <20100618133458.6640ce96@harpe.intellique.com> <20100618140028.05650928@harpe.intellique.com> <20100618150848.289428ed@harpe.intellique.com> <20100618160152.77dfb143@harpe.intellique.com> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.20.1; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1276894666 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32900 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Fri, 18 Jun 2010 20:50:49 +0200 vous =E9criviez: > when i compiled it i used libHX 3.4 as thats why the xfs_irecover=20 > ./configure demanded. Yes, but did you install libhx? Do you have /usr/lib/libHX.so* ? --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From SRS0+pXza+19+fromorbit.com=david@internode.on.net Fri Jun 18 19:04: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 o5J04Zx9245917 for ; Fri, 18 Jun 2010 19:04:36 -0500 X-ASG-Debug-ID: 1276906032-204a03dc0000-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 71C203E6E6D for ; Fri, 18 Jun 2010 17:07:13 -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 QuAJ0vGrJVBSLho8 for ; Fri, 18 Jun 2010 17:07:13 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28739638-1927428 for multiple; Sat, 19 Jun 2010 09:37:09 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OPlaV-0000jG-Bj; Sat, 19 Jun 2010 10:07:07 +1000 Date: Sat, 19 Jun 2010 10:07:07 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com, security@kernel.org X-ASG-Orig-Subj: Re: [PATCH 2/4] xfs: validate untrusted inode numbers during lookup Subject: Re: [PATCH 2/4] xfs: validate untrusted inode numbers during lookup Message-ID: <20100619000707.GH6590@dastard> References: <1276846374-23916-1-git-send-email-david@fromorbit.com> <1276846374-23916-3-git-send-email-david@fromorbit.com> <20100618114156.GA5417@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100618114156.GA5417@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: 1276906034 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32909 Rule breakdown below pts rule 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 18, 2010 at 07:41:56AM -0400, Christoph Hellwig wrote: > On Fri, Jun 18, 2010 at 05:32:52PM +1000, Dave Chinner wrote: > > +static int > > +xfs_imap_lookup( > > STATIC to keep the gcc inliner from overdoing thing? *Nod*. > > > + xfs_mount_t *mp, > > + xfs_trans_t *tp, > > > +{ > > + xfs_inobt_rec_incore_t rec; > > + xfs_btree_cur_t *cur; > > + xfs_buf_t *agbp; > > Please use the struct versions of these instead of the typedefs. Copy-n-paste error - my bad. > > +#ifdef DEBUG > > + xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " > > + "xfs_inobt_get_rec() failed"); > > +#endif /* DEBUG */ > > + error = XFS_ERROR(EINVAL); > > No need to print these even for debug kernels I think. And even then > we shouldn't do it if the untrusted flag is set. Ok, I killed all the prints - they don't tell us what inode number the error occurred on anyway, so they aren't very useful anyway.... > > + } > > +error0: > > I'd just call it out, or replace the goto by and if/else Ok, I rearranged the code to kill the goto. I will repost the series after a QA run. Cheers, Dave. -- Dave Chinner david@fromorbit.com From michael.monnerie@is.it-management.at Sat Jun 19 03:27: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 o5J8R5al262088 for ; Sat, 19 Jun 2010 03:27:05 -0500 X-ASG-Debug-ID: 1276936181-1ecd00480000-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 5F3003E79B7 for ; Sat, 19 Jun 2010 01:29:41 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id RmwlCwO6GW7hdNF0 for ; Sat, 19 Jun 2010 01:29:41 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 10F8F17A for ; Sat, 19 Jun 2010 10:29:40 +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 C666583C829 for ; Sat, 19 Jun 2010 10:29:23 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS Date: Sat, 19 Jun 2010 10:29:39 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) References: <201006181843.01755@zmi.at> <20100618185223.60119f36@harpe.intellique.com> In-Reply-To: <20100618185223.60119f36@harpe.intellique.com> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1396635.YvYnXYTL9n"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201006191029.39306@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1276936182 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32909 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart1396635.YvYnXYTL9n Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable On Freitag, 18. Juni 2010 Emmanuel Florac wrote: > > You have the money for a IBM DS4700 (costs with disk >15.000=E2=82=AC),= but > > not for 4 cheap 2TB SATA disks to at least copy the data there? > > That would have cost <500=E2=82=AC. >=20 > This isn't very helpful. Advice to everyone : read the tao of backup > ( http://www.taobackup.com ). Old, funny and still right on. =20 I didn't say it's a backup solution. It's the simplest form of keeping=20 data, and would have helped here.=20 We tend to do backup-to-disk and then disk-to-tape, which until now is=20 superior to just backup-to-tape. It speeds up backup and restore time,=20 even when "just" using simple 2TB SATA drives (in RAID-5 arrays). The=20 following disk-to-tape runs without any start/stop cycles of the tape=20 (mostly LTO4 now), leading to much longer tape and tape drive lifetimes=20 than before. =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/ --nextPart1396635.YvYnXYTL9n 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) iEYEABECAAYFAkwcf/MACgkQzhSR9xwSCbQU8wCgrXbepOaIzmbxvewy3bx9C9OM YjcAn1zwQMbqjU16K0kN6azfCEozYsjO =Ig6/ -----END PGP SIGNATURE----- --nextPart1396635.YvYnXYTL9n-- From grafgrimm77@gmx.de Sat Jun 19 07:58:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5JCwiwh008825 for ; Sat, 19 Jun 2010 07:58:45 -0500 X-ASG-Debug-ID: 1276952482-49db00880000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.gmx.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 0BF773E7D83 for ; Sat, 19 Jun 2010 06:01:23 -0700 (PDT) Received: from mail.gmx.net (mail.gmx.net [213.165.64.20]) by cuda.sgi.com with SMTP id 6NyJrbUuCHH2S0zp for ; Sat, 19 Jun 2010 06:01:23 -0700 (PDT) Received: (qmail invoked by alias); 19 Jun 2010 13:01:21 -0000 Received: from p4FDD1310.dip.t-dialin.net (EHLO server.grafnetz) [79.221.19.16] by mail.gmx.net (mp066) with SMTP; 19 Jun 2010 15:01:21 +0200 X-Authenticated: #1282162 X-Provags-ID: V01U2FsdGVkX1+uPWMitOCupcfacB324zs7X2iLgZkKklFNXzYntZ fQMpz8diSlixSX Received: from x2.grafnetz ([192.168.0.4]) by server.grafnetz with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.72) (envelope-from ) id 1OPxfk-0000cT-Gh for xfs@oss.sgi.com; Sat, 19 Jun 2010 15:01:20 +0200 Date: Sat, 19 Jun 2010 15:01:19 +0200 From: Mario Bachmann To: xfs@oss.sgi.com X-ASG-Orig-Subj: vmalloc, xfs_buf_get: failed to map pages Subject: vmalloc, xfs_buf_get: failed to map pages Message-ID: <20100619150119.3ce64102@x2.grafnetz> X-Mailer: Claws Mail 3.7.6 (GTK+ 2.20.1; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Y-GMX-Trusted: 0 X-Barracuda-Connect: mail.gmx.net[213.165.64.20] X-Barracuda-Start-Time: 1276952484 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0001 1.0000 -2.0204 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32909 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hello, on a 32bit machine, I have big problems with Linux 2.6.34. With Linux 2.6.33.4 everything runs fine. I do not know where to search for known bugs in xfs. /var/log/messages shows a lot of lines: Jun 19 11:43:15 amd2000 kernel: vmap allocation for size 4194304 failed: use vmalloc= to increase size. Jun 19 11:43:15 amd2000 kernel: xfs_buf_get: failed to map pages What to to? Mario From eflorac@intellique.com Sat Jun 19 08:11:26 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5JDBQEW009477 for ; Sat, 19 Jun 2010 08:11:26 -0500 X-ASG-Debug-ID: 1276953239-36e301190000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C377D1507EAA for ; Sat, 19 Jun 2010 06:14:02 -0700 (PDT) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id YaexEGloJ0lkuyGU for ; Sat, 19 Jun 2010 06:14:02 -0700 (PDT) Received: from galadriel.home (pla78-1-82-235-234-79.fbx.proxad.net [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id AD7A281802D; Sat, 19 Jun 2010 15:13:54 +0200 (CEST) Date: Sat, 19 Jun 2010 15:13:52 +0200 From: Emmanuel Florac To: Stan Hoeppner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS Message-ID: <20100619151352.5f725ade@galadriel.home> In-Reply-To: <4C1BAB09.4010801@hardwarefreak.com> References: <20100618133458.6640ce96@harpe.intellique.com> <201006181843.01755@zmi.at> <4C1BAB09.4010801@hardwarefreak.com> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.20.1; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1276953244 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32909 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Fri, 18 Jun 2010 12:21:13 -0500 vous =E9criviez: > Money isn't the issue here. Lack of planning and procedure seems to > be the issue. >=20 Yes, we all agree on that, Thomas must be inexperienced and nobody ever makes backup prior to serious data loss :) Now he'll see how to do backups, but his current problem is being able to restore the data if possible... --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From robert@timetraveller.org Sat Jun 19 10:08: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 o5JF8GtV013736 for ; Sat, 19 Jun 2010 10:08:16 -0500 X-ASG-Debug-ID: 1276960489-78db004e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from procyon.opentrend.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7E257159E11B for ; Sat, 19 Jun 2010 08:14:49 -0700 (PDT) Received: from procyon.opentrend.net (li144-209.members.linode.com [109.74.197.209]) by cuda.sgi.com with ESMTP id IbrRvoeVveCKBW1h for ; Sat, 19 Jun 2010 08:14:49 -0700 (PDT) Received: by procyon.opentrend.net (Postfix, from userid 1004) id DA57CCCAE; Sat, 19 Jun 2010 15:10:42 +0000 (UTC) Received: from castor.opentrend.net (unknown [192.168.120.16]) by procyon.opentrend.net (Postfix) with ESMTP id 21D27CCAC for ; Sat, 19 Jun 2010 15:10:41 +0000 (UTC) Received: by castor.opentrend.net (Postfix, from userid 1000) id 613EB4009B6EF; Sat, 19 Jun 2010 15:14:38 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by castor.opentrend.net (Postfix) with ESMTP id 5E4704008625D for ; Sat, 19 Jun 2010 11:14:38 -0400 (EDT) Date: Sat, 19 Jun 2010 11:14:38 -0400 (EDT) From: Robert Brockway X-X-Sender: robert@castor.opentrend.net To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Help with XFS Subject: Re: Help with XFS In-Reply-To: <20100618144821.0cab4bd4@harpe.intellique.com> Message-ID: References: <20100618132108.790921cf@harpe.intellique.com> <20100618133458.6640ce96@harpe.intellique.com> <20100618140028.05650928@harpe.intellique.com> <20100618144821.0cab4bd4@harpe.intellique.com> User-Agent: Alpine 1.10 (DEB 962 2008-03-14) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="8323329-292231012-1276960478=:26490" X-Barracuda-Connect: li144-209.members.linode.com[109.74.197.209] X-Barracuda-Start-Time: 1276960490 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.32909 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. --8323329-292231012-1276960478=:26490 Content-Type: TEXT/PLAIN; charset=iso-8859-1; format=flowed Content-Transfer-Encoding: 8BIT On Fri, 18 Jun 2010, Emmanuel Florac wrote: > Le Fri, 18 Jun 2010 14:30:43 +0200 > Thomas Førde écrivait: > >> ill see if we can rebuild a different SAN with mirror functionalityt, >> y have 384x300GB disk in my SAN, so it should be possible. > > No, a mirror will corrupt your data as well, a simple copy is better; Exactly. High availability and backups are two different things, although people often confuse them. Here are my notes from my backup talk: http://www.timetraveller.org/talks/backup_talk.pdf This approach is honed over many years, having done many disaster recoveries in the real world. Cheers, Rob -- Email: robert@timetraveller.org Linux counter ID #16440 IRC: Solver (OFTC & Freenode) Web: http://www.practicalsysadmin.com Open Source: The revolution that silently changed the world --8323329-292231012-1276960478=:26490-- From BATV+0f43bb3fde64658088bd+2491+infradead.org+hch@bombadil.srs.infradead.org Sat Jun 19 15:32:48 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5JKWkdo027920 for ; Sat, 19 Jun 2010 15:32:48 -0500 X-ASG-Debug-ID: 1276979725-455102180000-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 44F8C1E114AE for ; Sat, 19 Jun 2010 13:35:25 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id AHBKnP5ov9WHaR9T for ; Sat, 19 Jun 2010 13:35:25 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OQ4l9-00007f-GB; Sat, 19 Jun 2010 20:35:23 +0000 Date: Sat, 19 Jun 2010 16:35:23 -0400 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: remove xfs_iput_new Subject: Re: [PATCH] xfs: remove xfs_iput_new Message-ID: <20100619203523.GA30665@infradead.org> References: <20100611161824.GA7556@infradead.org> <20100615015300.GP6590@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100615015300.GP6590@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: 1276979725 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 15, 2010 at 11:53:00AM +1000, Dave Chinner wrote: > On Fri, Jun 11, 2010 at 12:18:24PM -0400, Christoph Hellwig wrote: > > 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 > > Reviewed-by: Dave Chinner There's in fact no need to lock the inode at all here, so this can be replaced with IRELE. I'll send an updated version with my next batch of patches. From SRS0+lqJd+20+fromorbit.com=dave@internode.on.net Sun Jun 20 18:40:27 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5KNeQFH091400 for ; Sun, 20 Jun 2010 18:40:27 -0500 X-ASG-Debug-ID: 1277077384-596602cb0000-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 91D2D1D5E147 for ; Sun, 20 Jun 2010 16:43:05 -0700 (PDT) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id Fq988u5DclKEke8Q for ; Sun, 20 Jun 2010 16:43:05 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28463014-1927428 for ; Mon, 21 Jun 2010 09:13:03 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OQUAH-00034H-Tl for xfs@oss.sgi.com; Mon, 21 Jun 2010 09:43:01 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OQUAE-0004ff-K9 for xfs@oss.sgi.com; Mon, 21 Jun 2010 09:42:58 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfsqa: test 214 leaves files around that cause 236 to fail Subject: [PATCH] xfsqa: test 214 leaves files around that cause 236 to fail Date: Mon, 21 Jun 2010 09:42:58 +1000 Message-Id: <1277077378-17927-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1277077386 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33084 Rule breakdown below pts rule 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 Test 214 and 236 use the same file names for test files in the TEST filesystem and don't check/create clean initial test state. Hence if you run 214 then 236, 236 will fail with: +link: cannot create link `/mnt/test/ouch2' to `/mnt/test/ouch': File exists +ctime: 1277076527 -> 1277076527 +Fatal error: ctime not updated after link Ensure that both tests clean up after themselves properly and also ensure a clean state before they start. Signed-off-by: Dave Chinner --- 214 | 2 ++ 236 | 13 +++++-------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/214 b/214 index eb18825..cef7626 100755 --- a/214 +++ b/214 @@ -29,6 +29,7 @@ echo "QA output created by $seq" _cleanup() { + rm -f $TEST_DIR/ouch* cd / rm -f $tmp.* } @@ -51,6 +52,7 @@ _supported_os Linux [ -n "$XFS_IO_PROG" ] || _notrun "xfs_io executable not found" rm -f $seq.full +rm -f $TEST_DIR/ouch* _require_xfs_io_falloc diff --git a/236 b/236 index 4d257f0..a7500ed 100644 --- a/236 +++ b/236 @@ -30,15 +30,12 @@ echo "QA output created by $seq" _cleanup() { - if [ -a $TEST_DIR/ouch2 ]; then - rm -f $TEST_DIR/ouch2 - fi - if [ -a $TEST_DIR/ouch ]; then - rm -f $TEST_DIR/ouch - fi + rm -f $TEST_DIR/ouch* } here=`pwd` +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 # get standard environment, filters and checks . ./common.rc @@ -48,6 +45,8 @@ _supported_fs generic # only Linux supports fallocate _supported_os Linux +rm -f $TEST_DIR/ouch* + # create a file and get its ctime touch $TEST_DIR/ouch ctime=`stat -c %Z $TEST_DIR/ouch` @@ -65,8 +64,6 @@ if [ $ctime2 -le $ctime ]; then exit 1 fi -_cleanup - echo "Test over." # success, all done status=0 -- 1.7.1 From SRS0+w5/N+20+fromorbit.com=dave@internode.on.net Sun Jun 20 18:56:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.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 o5KNua3T091929 for ; Sun, 20 Jun 2010 18:56:36 -0500 X-ASG-Debug-ID: 1277078354-5ebb00190000-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 2C3C73ED453 for ; Sun, 20 Jun 2010 16:59: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 mbxaP2iNN1jUbIdO for ; Sun, 20 Jun 2010 16:59:14 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28608413-1927428 for multiple; Mon, 21 Jun 2010 09:29:09 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OQUPr-00034w-MQ; Mon, 21 Jun 2010 09:59:07 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OQUPo-0004yv-C5; Mon, 21 Jun 2010 09:59:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: security@kernel.org X-ASG-Orig-Subj: [PATCH 3/4] xfs: rename XFS_IGET_BULKSTAT to XFS_IGET_UNTRUSTED Subject: [PATCH 3/4] xfs: rename XFS_IGET_BULKSTAT to XFS_IGET_UNTRUSTED Date: Mon, 21 Jun 2010 09:59:00 +1000 Message-Id: <1277078341-19087-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1277078341-19087-1-git-send-email-david@fromorbit.com> References: <1277078341-19087-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1277078356 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33086 Rule breakdown below pts rule 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 Inode numbers may come from somewhere external to the filesystem (e.g. file handles, bulkstat information) and so are inherently untrusted. Rename the flag we use for these lookups to make it obvious we are doing a lookup of an untrusted inode number and need to verify it completely before trying to read it from disk. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_export.c | 9 ++++----- fs/xfs/xfs_ialloc.c | 11 +++++++---- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_itable.c | 2 +- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_export.c b/fs/xfs/linux-2.6/xfs_export.c index e61232f..b39c05c 100644 --- a/fs/xfs/linux-2.6/xfs_export.c +++ b/fs/xfs/linux-2.6/xfs_export.c @@ -127,12 +127,11 @@ xfs_nfs_get_inode( return ERR_PTR(-ESTALE); /* - * The XFS_IGET_BULKSTAT means that an invalid inode number is just - * fine and not an indication of a corrupted filesystem. Because - * clients can send any kind of invalid file handle, e.g. after - * a restore on the server we have to deal with this case gracefully. + * The XFS_IGET_UNTRUSTED means that an invalid inode number is just + * fine and not an indication of a corrupted filesystem as clients can + * send invalid file handles and we have to handle it gracefully.. */ - error = xfs_iget(mp, NULL, ino, XFS_IGET_BULKSTAT, + error = xfs_iget(mp, NULL, ino, XFS_IGET_UNTRUSTED, XFS_ILOCK_SHARED, &ip, 0); if (error) { /* diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 142ae8c..c3de5fa 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -1247,7 +1247,7 @@ xfs_imap_lookup( return error; /* for untrusted inodes check it is allocated first */ - if ((flags & XFS_IGET_BULKSTAT) && + if ((flags & XFS_IGET_UNTRUSTED) && (rec.ir_free & XFS_INOBT_MASK(agino - rec.ir_startino))) return EINVAL; @@ -1288,8 +1288,11 @@ xfs_imap( if (agno >= mp->m_sb.sb_agcount || agbno >= mp->m_sb.sb_agblocks || ino != XFS_AGINO_TO_INO(mp, agno, agino)) { #ifdef DEBUG - /* no diagnostics for bulkstat, ino comes from userspace */ - if (flags & XFS_IGET_BULKSTAT) + /* + * Don't output diagnostic information for untrusted inodes + * as they can be invalid without implying corruption. + */ + if (flags & XFS_IGET_UNTRUSTED) return XFS_ERROR(EINVAL); if (agno >= mp->m_sb.sb_agcount) { xfs_fs_cmn_err(CE_ALERT, mp, @@ -1325,7 +1328,7 @@ xfs_imap( * inodes in stale state on disk. Hence we have to do a btree lookup * in all cases where an untrusted inode number is passed. */ - if (flags & XFS_IGET_BULKSTAT) { + if (flags & XFS_IGET_UNTRUSTED) { error = xfs_imap_lookup(mp, tp, agno, agino, agbno, &chunk_agbno, &offset_agbno, flags); if (error) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 5c2ada4..9101e79 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -173,7 +173,7 @@ xfs_imap_to_bp( if (unlikely(XFS_TEST_ERROR(!di_ok, mp, XFS_ERRTAG_ITOBP_INOTOBP, XFS_RANDOM_ITOBP_INOTOBP))) { - if (iget_flags & XFS_IGET_BULKSTAT) { + if (iget_flags & XFS_IGET_UNTRUSTED) { xfs_trans_brelse(tp, bp); return XFS_ERROR(EINVAL); } diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 10dd2e0..7a2f347 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -499,7 +499,7 @@ do { \ * Flags for xfs_iget() */ #define XFS_IGET_CREATE 0x1 -#define XFS_IGET_BULKSTAT 0x2 +#define XFS_IGET_UNTRUSTED 0x2 int xfs_inotobp(struct xfs_mount *, struct xfs_trans *, xfs_ino_t, struct xfs_dinode **, diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index f554bd9..5fccd84 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -76,7 +76,7 @@ xfs_bulkstat_one_int( return XFS_ERROR(ENOMEM); error = xfs_iget(mp, NULL, ino, - XFS_IGET_BULKSTAT, XFS_ILOCK_SHARED, &ip, bno); + XFS_IGET_UNTRUSTED, XFS_ILOCK_SHARED, &ip, bno); if (error) { *stat = BULKSTAT_RV_NOTHING; goto out_free; -- 1.7.1 From SRS0+sBgx+20+fromorbit.com=dave@internode.on.net Sun Jun 20 18:56:42 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5KNugdf091947 for ; Sun, 20 Jun 2010 18:56:42 -0500 X-ASG-Debug-ID: 1277078602-1aa402900000-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 B73F1B285D1 for ; Sun, 20 Jun 2010 17:03:22 -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 N1K9KKQwtq3NbbJ9 for ; Sun, 20 Jun 2010 17:03:22 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28706101-1927428 for ; Mon, 21 Jun 2010 09:29:18 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OQUPr-00034r-Ft; Mon, 21 Jun 2010 09:59:07 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OQUPo-0004yo-5C; Mon, 21 Jun 2010 09:59:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: security@kernel.org X-ASG-Orig-Subj: [PATCH 0/4, V2] xfs: validate inode numbers in file handles correctly Subject: [PATCH 0/4, V2] xfs: validate inode numbers in file handles correctly Date: Mon, 21 Jun 2010 09:58:57 +1000 Message-Id: <1277078341-19087-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1277078604 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33085 Rule breakdown below pts rule 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 closes a recently discovered problem in XFS filehandle conversion. On systems where inodes are dynamically deleted, XFS does not adequately verify the inode numbers in the filehandles, which results in reading stale inodes from disk and potentially returning them as valid files. Because these unlinked inodes were never zeroed out when the chunk was deallocated, some inodes in the chunk can still appear to have to data extents attached to them. This can lead to stale data exposure, exposure of active data and potentially overwriting of active data if the stale extents referenced in the unlinked inodes have been re-allocated. Both NFS filehandles and local filehandles provided through libhandle have this same problem. libhandle requires root permissions to use the interface, so it is not exposing information that you can't get more easily with other means (e.g. xfs_db or reading directly form the block device), so there isn't really an issue here. For NFS, we may incorrectly accept stale file handles for unlinked inodes after a server reboot if the unlinked inodes have not been overwritten leading to the above issues being triggered if multiple NFS clients are accessing the same files. Christoph's make-bulkstat-coherent patch is the basis for this series as bulkstat can also expose unlinked inodes and information about them back to userspace as it makes the same assumptions about inode lookups as the file handle interfaces. As a result, the first two patches of the series make up the real bug fix. The last two patches make it clear we are lookuping up untrusted inode numbers and clear away a shortcut that these interfaces used that we do not want used any more. Hence for backports to other kernels, only the first two patches are necessary. The test program that demonstrates the issue via the open_by_handle interface can be found here: http://oss.sgi.com/archives/xfs/2010-06/msg00191.html Version 2: - removed useless ip->i_imap.im_blkno initialisation in xfs_iread() - reworked a comment refering to bulkstat when it should refer to untrusted inodes. - removed typedefs from xfs_imap_lookup() - killed useless error logging from xfs_imap_lookup() - rearranged the logic flow of xfs_imap_lookup() to remove the gotos. From SRS0+EM/E+20+fromorbit.com=dave@internode.on.net Sun Jun 20 18: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.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5KNui9c091964 for ; Sun, 20 Jun 2010 18:56:45 -0500 X-ASG-Debug-ID: 1277078605-331001720000-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 5ADBCB285EC for ; Sun, 20 Jun 2010 17:03:26 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id qIu8GS8Jnzn3KsjS for ; Sun, 20 Jun 2010 17:03:26 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 17000637-1927428 for multiple; Mon, 21 Jun 2010 09:29:18 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OQUQ1-00034t-JO; Mon, 21 Jun 2010 09:59:17 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OQUPo-0004ys-9h; Mon, 21 Jun 2010 09:59:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: security@kernel.org X-ASG-Orig-Subj: [PATCH 2/4] xfs: validate untrusted inode numbers during lookup Subject: [PATCH 2/4] xfs: validate untrusted inode numbers during lookup Date: Mon, 21 Jun 2010 09:58:59 +1000 Message-Id: <1277078341-19087-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1277078341-19087-1-git-send-email-david@fromorbit.com> References: <1277078341-19087-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1277078607 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33085 Rule breakdown below pts rule 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 When we decode a handle or do a bulkstat lookup, we are using an inode number we cannot trust to be valid. If we are deleting inode chunks from disk (default noikeep mode), then we cannot trust the on disk inode buffer for any given inode number to correctly reflect whether the inode has been unlinked as the di_mode nor the generation number may have been updated on disk. This is due to the fact that when we delete an inode chunk, we do not write the clusters back to disk when they are removed - instead we mark them stale to avoid them being written back potentially over the top of something that has been subsequently allocated at that location. The result is that we can have locations of disk that look like they contain valid inodes but in reality do not. Hence we cannot simply convert the inode number to a block number and read the location from disk to determine if the inode is valid or not. As a result, and XFS_IGET_BULKSTAT lookup needs to actually look the inode up in the inode allocation btree to determine if the inode number is valid or not. It should be noted even on ikeep filesystems, there is the possibility that blocks on disk may look like valid inode clusters. e.g. if there are filesystem images hosted on the filesystem. Hence even for ikeep filesystems we really need to validate that the inode number is valid before issuing the inode buffer read. Signed-off-by: Dave Chinner --- fs/xfs/xfs_ialloc.c | 121 +++++++++++++++++++++++++++++++++------------------ 1 files changed, 78 insertions(+), 43 deletions(-) diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 0cf49f0..142ae8c 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -1199,6 +1199,63 @@ error0: return error; } +STATIC int +xfs_imap_lookup( + struct xfs_mount *mp, + struct xfs_trans *tp, + xfs_agnumber_t agno, + xfs_agino_t agino, + xfs_agblock_t agbno, + xfs_agblock_t *chunk_agbno, + xfs_agblock_t *offset_agbno, + int flags) +{ + struct xfs_inobt_rec_incore rec; + struct xfs_btree_cur *cur; + struct xfs_buf *agbp; + xfs_agino_t startino; + int error; + int i; + + error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); + if (error) { + xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " + "xfs_ialloc_read_agi() returned " + "error %d, agno %d", + error, agno); + return error; + } + + /* + * derive and lookup the exact inode record for the given agino. If the + * record cannot be found, then it's an invalid inode number and we + * should abort. + */ + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); + startino = agino & ~(XFS_IALLOC_INODES(mp) - 1); + error = xfs_inobt_lookup(cur, startino, XFS_LOOKUP_EQ, &i); + if (!error) { + if (i) + error = xfs_inobt_get_rec(cur, &rec, &i); + if (!error && i == 0) + error = EINVAL; + } + + xfs_trans_brelse(tp, agbp); + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + if (error) + return error; + + /* for untrusted inodes check it is allocated first */ + if ((flags & XFS_IGET_BULKSTAT) && + (rec.ir_free & XFS_INOBT_MASK(agino - rec.ir_startino))) + return EINVAL; + + *chunk_agbno = XFS_AGINO_TO_AGBNO(mp, rec.ir_startino); + *offset_agbno = agbno - *chunk_agbno; + return 0; +} + /* * Return the location of the inode in imap, for mapping it into a buffer. */ @@ -1259,6 +1316,23 @@ xfs_imap( return XFS_ERROR(EINVAL); } + blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_blocklog; + + /* + * For bulkstat and handle lookups, we have an untrusted inode number + * that we have to verify is valid. We cannot do this just by reading + * the inode buffer as it may have been unlinked and removed leaving + * inodes in stale state on disk. Hence we have to do a btree lookup + * in all cases where an untrusted inode number is passed. + */ + if (flags & XFS_IGET_BULKSTAT) { + error = xfs_imap_lookup(mp, tp, agno, agino, agbno, + &chunk_agbno, &offset_agbno, flags); + if (error) + return error; + goto out_map; + } + /* * If the inode cluster size is the same as the blocksize or * smaller we get to the buffer by simple arithmetics. @@ -1273,10 +1347,8 @@ xfs_imap( return 0; } - blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_blocklog; - /* - * If we get a block number passed from bulkstat we can use it to + * If we get a block number passed we can use it to * find the buffer easily. */ if (imap->im_blkno) { @@ -1300,50 +1372,13 @@ xfs_imap( offset_agbno = agbno & mp->m_inoalign_mask; chunk_agbno = agbno - offset_agbno; } else { - xfs_btree_cur_t *cur; /* inode btree cursor */ - xfs_inobt_rec_incore_t chunk_rec; - xfs_buf_t *agbp; /* agi buffer */ - int i; /* temp state */ - - error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); - if (error) { - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " - "xfs_ialloc_read_agi() returned " - "error %d, agno %d", - error, agno); - return error; - } - - cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); - error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &i); - if (error) { - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " - "xfs_inobt_lookup() failed"); - goto error0; - } - - error = xfs_inobt_get_rec(cur, &chunk_rec, &i); - if (error) { - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " - "xfs_inobt_get_rec() failed"); - goto error0; - } - if (i == 0) { -#ifdef DEBUG - xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: " - "xfs_inobt_get_rec() failed"); -#endif /* DEBUG */ - error = XFS_ERROR(EINVAL); - } - error0: - xfs_trans_brelse(tp, agbp); - xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + error = xfs_imap_lookup(mp, tp, agno, agino, agbno, + &chunk_agbno, &offset_agbno, flags); if (error) return error; - chunk_agbno = XFS_AGINO_TO_AGBNO(mp, chunk_rec.ir_startino); - offset_agbno = agbno - chunk_agbno; } +out_map: ASSERT(agbno >= chunk_agbno); cluster_agbno = chunk_agbno + ((offset_agbno / blks_per_cluster) * blks_per_cluster); -- 1.7.1 From SRS0+EM/E+20+fromorbit.com=dave@internode.on.net Sun Jun 20 18: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.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_63, J_CHICKENPOX_66,J_CHICKENPOX_92 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5KNulPk091982 for ; Sun, 20 Jun 2010 18:56:47 -0500 X-ASG-Debug-ID: 1277078365-522100dd0000-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 679843ED454 for ; Sun, 20 Jun 2010 16:59:26 -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 cUhGyhSvG4fWDIfx for ; Sun, 20 Jun 2010 16:59:26 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28560721-1927428 for multiple; Mon, 21 Jun 2010 09:29:19 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OQUQ1-000356-Ql; Mon, 21 Jun 2010 09:59:17 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OQUPo-0004yz-ER; Mon, 21 Jun 2010 09:59:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: security@kernel.org X-ASG-Orig-Subj: [PATCH 4/4] xfs: remove block number from inode lookup code Subject: [PATCH 4/4] xfs: remove block number from inode lookup code Date: Mon, 21 Jun 2010 09:59:01 +1000 Message-Id: <1277078341-19087-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1277078341-19087-1-git-send-email-david@fromorbit.com> References: <1277078341-19087-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1277078367 X-Barracuda-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.33086 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner The block number comes from bulkstat based inode lookups to shortcut the mapping calculations. We ar enot able to trust anything from bulkstat, so drop the block number as well so that the correct lookups and mappings are always done. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_export.c | 2 +- fs/xfs/linux-2.6/xfs_ioctl32.c | 5 ++--- fs/xfs/quota/xfs_qm.c | 7 +++---- fs/xfs/quota/xfs_qm_syscalls.c | 11 +++++------ fs/xfs/xfs_ialloc.c | 16 ---------------- fs/xfs/xfs_iget.c | 10 +++------- fs/xfs/xfs_inode.c | 3 --- fs/xfs/xfs_inode.h | 4 ++-- fs/xfs/xfs_itable.c | 12 ++++-------- fs/xfs/xfs_itable.h | 3 --- fs/xfs/xfs_log_recover.c | 2 +- fs/xfs/xfs_mount.c | 2 +- fs/xfs/xfs_rtalloc.c | 4 ++-- fs/xfs/xfs_trans_inode.c | 2 +- fs/xfs/xfs_vnodeops.c | 2 +- 15 files changed, 26 insertions(+), 59 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_export.c b/fs/xfs/linux-2.6/xfs_export.c index b39c05c..55df942 100644 --- a/fs/xfs/linux-2.6/xfs_export.c +++ b/fs/xfs/linux-2.6/xfs_export.c @@ -132,7 +132,7 @@ xfs_nfs_get_inode( * send invalid file handles and we have to handle it gracefully.. */ error = xfs_iget(mp, NULL, ino, XFS_IGET_UNTRUSTED, - XFS_ILOCK_SHARED, &ip, 0); + XFS_ILOCK_SHARED, &ip); if (error) { /* * EINVAL means the inode cluster doesn't exist anymore. diff --git a/fs/xfs/linux-2.6/xfs_ioctl32.c b/fs/xfs/linux-2.6/xfs_ioctl32.c index 48c1aba..6cd1225 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl32.c +++ b/fs/xfs/linux-2.6/xfs_ioctl32.c @@ -233,12 +233,11 @@ xfs_bulkstat_one_compat( xfs_ino_t ino, /* inode number to get data for */ void __user *buffer, /* buffer to place output in */ int ubsize, /* size of buffer */ - xfs_daddr_t bno, /* starting bno of inode cluster */ int *ubused, /* bytes used by me */ int *stat) /* BULKSTAT_RV_... */ { return xfs_bulkstat_one_int(mp, ino, buffer, ubsize, - xfs_bulkstat_one_fmt_compat, bno, + xfs_bulkstat_one_fmt_compat, ubused, stat); } @@ -292,7 +291,7 @@ xfs_compat_ioc_bulkstat( int res; error = xfs_bulkstat_one_compat(mp, inlast, bulkreq.ubuffer, - sizeof(compat_xfs_bstat_t), 0, NULL, &res); + sizeof(compat_xfs_bstat_t), 0, &res); } else if (cmd == XFS_IOC_FSBULKSTAT_32) { error = xfs_bulkstat(mp, &inlast, &count, xfs_bulkstat_one_compat, sizeof(compat_xfs_bstat_t), diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index 25bc7da..175032f 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c @@ -1625,7 +1625,6 @@ xfs_qm_dqusage_adjust( xfs_ino_t ino, /* inode number to get data for */ void __user *buffer, /* not used */ int ubsize, /* not used */ - xfs_daddr_t bno, /* starting block of inode cluster */ int *ubused, /* not used */ int *res) /* result code value */ { @@ -1651,7 +1650,7 @@ xfs_qm_dqusage_adjust( * the case in all other instances. It's OK that we do this because * quotacheck is done only at mount time. */ - if ((error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_EXCL, &ip, bno))) { + if ((error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_EXCL, &ip))) { *res = BULKSTAT_RV_NOTHING; return error; } @@ -1881,14 +1880,14 @@ xfs_qm_init_quotainos( mp->m_sb.sb_uquotino != NULLFSINO) { ASSERT(mp->m_sb.sb_uquotino > 0); if ((error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, - 0, 0, &uip, 0))) + 0, 0, &uip))) return XFS_ERROR(error); } if (XFS_IS_OQUOTA_ON(mp) && mp->m_sb.sb_gquotino != NULLFSINO) { ASSERT(mp->m_sb.sb_gquotino > 0); if ((error = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, - 0, 0, &gip, 0))) { + 0, 0, &gip))) { if (uip) IRELE(uip); return XFS_ERROR(error); diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index aa44c58..2d1abbf 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c @@ -252,7 +252,7 @@ xfs_qm_scall_trunc_qfiles( } if ((flags & XFS_DQ_USER) && mp->m_sb.sb_uquotino != NULLFSINO) { - error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, 0, 0, &qip, 0); + error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, 0, 0, &qip); if (!error) { error = xfs_truncate_file(mp, qip); IRELE(qip); @@ -261,7 +261,7 @@ xfs_qm_scall_trunc_qfiles( if ((flags & (XFS_DQ_GROUP|XFS_DQ_PROJ)) && mp->m_sb.sb_gquotino != NULLFSINO) { - error2 = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, 0, 0, &qip, 0); + error2 = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, 0, 0, &qip); if (!error2) { error2 = xfs_truncate_file(mp, qip); IRELE(qip); @@ -407,12 +407,12 @@ xfs_qm_scall_getqstat( } if (!uip && mp->m_sb.sb_uquotino != NULLFSINO) { if (xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, - 0, 0, &uip, 0) == 0) + 0, 0, &uip) == 0) tempuqip = B_TRUE; } if (!gip && mp->m_sb.sb_gquotino != NULLFSINO) { if (xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, - 0, 0, &gip, 0) == 0) + 0, 0, &gip) == 0) tempgqip = B_TRUE; } if (uip) { @@ -1095,7 +1095,6 @@ xfs_qm_internalqcheck_adjust( xfs_ino_t ino, /* inode number to get data for */ void __user *buffer, /* not used */ int ubsize, /* not used */ - xfs_daddr_t bno, /* starting block of inode cluster */ int *ubused, /* not used */ int *res) /* bulkstat result code */ { @@ -1118,7 +1117,7 @@ xfs_qm_internalqcheck_adjust( ipreleased = B_FALSE; again: lock_flags = XFS_ILOCK_SHARED; - if ((error = xfs_iget(mp, NULL, ino, 0, lock_flags, &ip, bno))) { + if ((error = xfs_iget(mp, NULL, ino, 0, lock_flags, &ip))) { *res = BULKSTAT_RV_NOTHING; return (error); } diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index c3de5fa..abf80ae 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -1351,22 +1351,6 @@ xfs_imap( } /* - * If we get a block number passed we can use it to - * find the buffer easily. - */ - if (imap->im_blkno) { - offset = XFS_INO_TO_OFFSET(mp, ino); - ASSERT(offset < mp->m_sb.sb_inopblock); - - cluster_agbno = xfs_daddr_to_agbno(mp, imap->im_blkno); - offset += (agbno - cluster_agbno) * mp->m_sb.sb_inopblock; - - imap->im_len = XFS_FSB_TO_BB(mp, blks_per_cluster); - imap->im_boffset = (ushort)(offset << mp->m_sb.sb_inodelog); - return 0; - } - - /* * If the inode chunks are aligned then use simple maths to * find the location. Otherwise we have to do a btree * lookup to find the location. diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index a80b9b9..d6ef971 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c @@ -255,7 +255,6 @@ xfs_iget_cache_miss( xfs_trans_t *tp, xfs_ino_t ino, struct xfs_inode **ipp, - xfs_daddr_t bno, int flags, int lock_flags) { @@ -268,7 +267,7 @@ xfs_iget_cache_miss( if (!ip) return ENOMEM; - error = xfs_iread(mp, tp, ip, bno, flags); + error = xfs_iread(mp, tp, ip, flags); if (error) goto out_destroy; @@ -354,8 +353,6 @@ out_destroy: * within the file system for the inode being requested. * lock_flags -- flags indicating how to lock the inode. See the comment * for xfs_ilock() for a list of valid values. - * bno -- the block number starting the buffer containing the inode, - * if known (as by bulkstat), else 0. */ int xfs_iget( @@ -364,8 +361,7 @@ xfs_iget( xfs_ino_t ino, uint flags, uint lock_flags, - xfs_inode_t **ipp, - xfs_daddr_t bno) + xfs_inode_t **ipp) { xfs_inode_t *ip; int error; @@ -393,7 +389,7 @@ again: read_unlock(&pag->pag_ici_lock); XFS_STATS_INC(xs_ig_missed); - error = xfs_iget_cache_miss(mp, pag, tp, ino, &ip, bno, + error = xfs_iget_cache_miss(mp, pag, tp, ino, &ip, flags, lock_flags); if (error) goto out_error_or_again; diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 9101e79..5715a9d 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -783,7 +783,6 @@ xfs_iread( xfs_mount_t *mp, xfs_trans_t *tp, xfs_inode_t *ip, - xfs_daddr_t bno, uint iget_flags) { xfs_buf_t *bp; @@ -793,11 +792,9 @@ xfs_iread( /* * Fill in the location information in the in-core inode. */ - ip->i_imap.im_blkno = bno; error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, iget_flags); if (error) return error; - ASSERT(bno == 0 || bno == ip->i_imap.im_blkno); /* * Get pointers to the on-disk inode and the buffer containing it. diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 7a2f347..7a19d52 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -442,7 +442,7 @@ static inline void xfs_ifunlock(xfs_inode_t *ip) * xfs_iget.c prototypes. */ int xfs_iget(struct xfs_mount *, struct xfs_trans *, xfs_ino_t, - uint, uint, xfs_inode_t **, xfs_daddr_t); + uint, uint, xfs_inode_t **); void xfs_iput(xfs_inode_t *, uint); void xfs_ilock(xfs_inode_t *, uint); int xfs_ilock_nowait(xfs_inode_t *, uint); @@ -508,7 +508,7 @@ int xfs_itobp(struct xfs_mount *, struct xfs_trans *, struct xfs_inode *, struct xfs_dinode **, struct xfs_buf **, uint); int xfs_iread(struct xfs_mount *, struct xfs_trans *, - struct xfs_inode *, xfs_daddr_t, uint); + struct xfs_inode *, uint); void xfs_dinode_to_disk(struct xfs_dinode *, struct xfs_icdinode *); void xfs_idestroy_fork(struct xfs_inode *, int); diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 5fccd84..200dc6f 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -56,7 +56,6 @@ xfs_bulkstat_one_int( void __user *buffer, /* buffer to place output in */ int ubsize, /* size of buffer */ bulkstat_one_fmt_pf formatter, /* formatter, copy to user */ - xfs_daddr_t bno, /* starting bno of cluster */ int *ubused, /* bytes used by me */ int *stat) /* BULKSTAT_RV_... */ { @@ -76,7 +75,7 @@ xfs_bulkstat_one_int( return XFS_ERROR(ENOMEM); error = xfs_iget(mp, NULL, ino, - XFS_IGET_UNTRUSTED, XFS_ILOCK_SHARED, &ip, bno); + XFS_IGET_UNTRUSTED, XFS_ILOCK_SHARED, &ip); if (error) { *stat = BULKSTAT_RV_NOTHING; goto out_free; @@ -175,13 +174,11 @@ xfs_bulkstat_one( xfs_ino_t ino, /* inode number to get data for */ void __user *buffer, /* buffer to place output in */ int ubsize, /* size of buffer */ - xfs_daddr_t bno, /* starting bno of inode cluster */ int *ubused, /* bytes used by me */ int *stat) /* BULKSTAT_RV_... */ { return xfs_bulkstat_one_int(mp, ino, buffer, ubsize, - xfs_bulkstat_one_fmt, bno, - ubused, stat); + xfs_bulkstat_one_fmt, ubused, stat); } #define XFS_BULKSTAT_UBLEFT(ubleft) ((ubleft) >= statstruct_size) @@ -481,7 +478,7 @@ xfs_bulkstat( * Get the inode and fill in a single buffer. */ ubused = statstruct_size; - error = formatter(mp, ino, ubufp, ubleft, bno, + error = formatter(mp, ino, ubufp, ubleft, &ubused, &fmterror); if (fmterror == BULKSTAT_RV_NOTHING) { if (error && error != ENOENT && @@ -574,8 +571,7 @@ xfs_bulkstat_single( */ ino = (xfs_ino_t)*lastinop; - error = xfs_bulkstat_one(mp, ino, buffer, sizeof(xfs_bstat_t), - 0, NULL, &res); + error = xfs_bulkstat_one(mp, ino, buffer, sizeof(xfs_bstat_t), 0, &res); if (error) { /* * Special case way failed, do it the "long" way diff --git a/fs/xfs/xfs_itable.h b/fs/xfs/xfs_itable.h index fea0339..97295d9 100644 --- a/fs/xfs/xfs_itable.h +++ b/fs/xfs/xfs_itable.h @@ -27,7 +27,6 @@ typedef int (*bulkstat_one_pf)(struct xfs_mount *mp, xfs_ino_t ino, void __user *buffer, int ubsize, - xfs_daddr_t bno, int *ubused, int *stat); @@ -71,7 +70,6 @@ xfs_bulkstat_one_int( void __user *buffer, int ubsize, bulkstat_one_fmt_pf formatter, - xfs_daddr_t bno, int *ubused, int *stat); @@ -81,7 +79,6 @@ xfs_bulkstat_one( xfs_ino_t ino, void __user *buffer, int ubsize, - xfs_daddr_t bno, int *ubused, int *stat); diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 1ac0b79..6f3f5fa 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3186,7 +3186,7 @@ xlog_recover_process_one_iunlink( int error; ino = XFS_AGINO_TO_INO(mp, agno, agino); - error = xfs_iget(mp, NULL, ino, 0, 0, &ip, 0); + error = xfs_iget(mp, NULL, ino, 0, 0, &ip); if (error) goto fail; diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 4e1725b..aeb9d72 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1297,7 +1297,7 @@ xfs_mountfs( * Get and sanity-check the root inode. * Save the pointer to it in the mount structure. */ - error = xfs_iget(mp, NULL, sbp->sb_rootino, 0, XFS_ILOCK_EXCL, &rip, 0); + error = xfs_iget(mp, NULL, sbp->sb_rootino, 0, XFS_ILOCK_EXCL, &rip); if (error) { cmn_err(CE_WARN, "XFS: failed to read root inode"); goto out_log_dealloc; diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 20b5eb7..891260f 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -2270,12 +2270,12 @@ xfs_rtmount_inodes( sbp = &mp->m_sb; if (sbp->sb_rbmino == NULLFSINO) return 0; - error = xfs_iget(mp, NULL, sbp->sb_rbmino, 0, 0, &mp->m_rbmip, 0); + error = xfs_iget(mp, NULL, sbp->sb_rbmino, 0, 0, &mp->m_rbmip); if (error) return error; ASSERT(mp->m_rbmip != NULL); ASSERT(sbp->sb_rsumino != NULLFSINO); - error = xfs_iget(mp, NULL, sbp->sb_rsumino, 0, 0, &mp->m_rsumip, 0); + error = xfs_iget(mp, NULL, sbp->sb_rsumino, 0, 0, &mp->m_rsumip); if (error) { IRELE(mp->m_rbmip); return error; diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c index 10534c2..cdc53a1 100644 --- a/fs/xfs/xfs_trans_inode.c +++ b/fs/xfs/xfs_trans_inode.c @@ -57,7 +57,7 @@ xfs_trans_iget( { int error; - error = xfs_iget(mp, tp, ino, flags, lock_flags, ipp, 0); + error = xfs_iget(mp, tp, ino, flags, lock_flags, ipp); if (!error && tp) { xfs_trans_ijoin(tp, *ipp); (*ipp)->i_itemp->ili_lock_flags = lock_flags; diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index df6d1b5..ad599cc 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -1233,7 +1233,7 @@ xfs_lookup( if (error) goto out; - error = xfs_iget(dp->i_mount, NULL, inum, 0, 0, ipp, 0); + error = xfs_iget(dp->i_mount, NULL, inum, 0, 0, ipp); if (error) goto out_free_name; -- 1.7.1 From SRS0+sBgx+20+fromorbit.com=dave@internode.on.net Sun Jun 20 18:56: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.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_62, J_CHICKENPOX_92 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 o5KNuq9Y092000 for ; Sun, 20 Jun 2010 18:56:53 -0500 X-ASG-Debug-ID: 1277078612-0b3e033e0000-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 CDF09B285FB for ; Sun, 20 Jun 2010 17:03:33 -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 VZdhBk2A0h6woWmp for ; Sun, 20 Jun 2010 17:03:33 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28706145-1927428 for ; Mon, 21 Jun 2010 09:29:29 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1OQUPr-00034s-Ht; Mon, 21 Jun 2010 09:59:07 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1OQUPo-0004yq-78; Mon, 21 Jun 2010 09:59:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: security@kernel.org X-ASG-Orig-Subj: [PATCH 1/4] xfs: always use iget in bulkstat Subject: [PATCH 1/4] xfs: always use iget in bulkstat Date: Mon, 21 Jun 2010 09:58:58 +1000 Message-Id: <1277078341-19087-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1277078341-19087-1-git-send-email-david@fromorbit.com> References: <1277078341-19087-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1277078614 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33085 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Christoph Hellwig The non-coherent bulkstat versionsthat look directly at the inode buffers causes various problems with performance optimizations that make increased use of just logging inodes. This patch makes bulkstat always use iget, which should be fast enough for normal use with the radix-tree based inode cache introduced a while ago. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_ioctl.c | 7 +- fs/xfs/linux-2.6/xfs_ioctl32.c | 12 +- fs/xfs/quota/xfs_qm.c | 11 +- fs/xfs/quota/xfs_qm_syscalls.c | 16 +-- fs/xfs/xfs_itable.c | 281 ++++++---------------------------------- fs/xfs/xfs_itable.h | 14 -- 6 files changed, 59 insertions(+), 282 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index faafd94..a12ddda 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c @@ -670,10 +670,9 @@ xfs_ioc_bulkstat( error = xfs_bulkstat_single(mp, &inlast, bulkreq.ubuffer, &done); else /* XFS_IOC_FSBULKSTAT */ - error = xfs_bulkstat(mp, &inlast, &count, - (bulkstat_one_pf)xfs_bulkstat_one, NULL, - sizeof(xfs_bstat_t), bulkreq.ubuffer, - BULKSTAT_FG_QUICK, &done); + error = xfs_bulkstat(mp, &inlast, &count, xfs_bulkstat_one, + sizeof(xfs_bstat_t), bulkreq.ubuffer, + &done); if (error) return -error; diff --git a/fs/xfs/linux-2.6/xfs_ioctl32.c b/fs/xfs/linux-2.6/xfs_ioctl32.c index 40118b6..48c1aba 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl32.c +++ b/fs/xfs/linux-2.6/xfs_ioctl32.c @@ -233,15 +233,13 @@ xfs_bulkstat_one_compat( xfs_ino_t ino, /* inode number to get data for */ void __user *buffer, /* buffer to place output in */ int ubsize, /* size of buffer */ - void *private_data, /* my private data */ xfs_daddr_t bno, /* starting bno of inode cluster */ int *ubused, /* bytes used by me */ - void *dibuff, /* on-disk inode buffer */ int *stat) /* BULKSTAT_RV_... */ { return xfs_bulkstat_one_int(mp, ino, buffer, ubsize, xfs_bulkstat_one_fmt_compat, bno, - ubused, dibuff, stat); + ubused, stat); } /* copied from xfs_ioctl.c */ @@ -294,13 +292,11 @@ xfs_compat_ioc_bulkstat( int res; error = xfs_bulkstat_one_compat(mp, inlast, bulkreq.ubuffer, - sizeof(compat_xfs_bstat_t), - NULL, 0, NULL, NULL, &res); + sizeof(compat_xfs_bstat_t), 0, NULL, &res); } else if (cmd == XFS_IOC_FSBULKSTAT_32) { error = xfs_bulkstat(mp, &inlast, &count, - xfs_bulkstat_one_compat, NULL, - sizeof(compat_xfs_bstat_t), bulkreq.ubuffer, - BULKSTAT_FG_QUICK, &done); + xfs_bulkstat_one_compat, sizeof(compat_xfs_bstat_t), + bulkreq.ubuffer, &done); } else error = XFS_ERROR(EINVAL); if (error) diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index 7a231ff..25bc7da 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c @@ -1625,10 +1625,8 @@ xfs_qm_dqusage_adjust( xfs_ino_t ino, /* inode number to get data for */ void __user *buffer, /* not used */ int ubsize, /* not used */ - void *private_data, /* not used */ xfs_daddr_t bno, /* starting block of inode cluster */ int *ubused, /* not used */ - void *dip, /* on-disk inode pointer (not used) */ int *res) /* result code value */ { xfs_inode_t *ip; @@ -1789,12 +1787,13 @@ xfs_qm_quotacheck( * Iterate thru all the inodes in the file system, * adjusting the corresponding dquot counters in core. */ - if ((error = xfs_bulkstat(mp, &lastino, &count, - xfs_qm_dqusage_adjust, NULL, - structsz, NULL, BULKSTAT_FG_IGET, &done))) + error = xfs_bulkstat(mp, &lastino, &count, + xfs_qm_dqusage_adjust, + structsz, NULL, &done); + if (error) break; - } while (! done); + } while (!done); /* * We've made all the changes that we need to make incore. diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index 19f218c..aa44c58 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c @@ -1095,10 +1095,8 @@ xfs_qm_internalqcheck_adjust( xfs_ino_t ino, /* inode number to get data for */ void __user *buffer, /* not used */ int ubsize, /* not used */ - void *private_data, /* not used */ xfs_daddr_t bno, /* starting block of inode cluster */ int *ubused, /* not used */ - void *dip, /* not used */ int *res) /* bulkstat result code */ { xfs_inode_t *ip; @@ -1191,15 +1189,15 @@ xfs_qm_internalqcheck( * Iterate thru all the inodes in the file system, * adjusting the corresponding dquot counters */ - if ((error = xfs_bulkstat(mp, &lastino, &count, - xfs_qm_internalqcheck_adjust, NULL, - 0, NULL, BULKSTAT_FG_IGET, &done))) { + error = xfs_bulkstat(mp, &lastino, &count, + xfs_qm_internalqcheck_adjust, + 0, NULL, &done); + if (error) { + cmn_err(CE_DEBUG, "Bulkstat returned error 0x%x", error); break; } - } while (! done); - if (error) { - cmn_err(CE_DEBUG, "Bulkstat returned error 0x%x", error); - } + } while (!done); + cmn_err(CE_DEBUG, "Checking results against system dquots"); for (i = 0; i < qmtest_hashmask; i++) { xfs_dqtest_t *d, *n; diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 8314386..f554bd9 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -45,24 +45,41 @@ xfs_internal_inum( (ino == mp->m_sb.sb_uquotino || ino == mp->m_sb.sb_gquotino))); } -STATIC int -xfs_bulkstat_one_iget( - xfs_mount_t *mp, /* mount point for filesystem */ - xfs_ino_t ino, /* inode number to get data for */ - xfs_daddr_t bno, /* starting bno of inode cluster */ - xfs_bstat_t *buf, /* return buffer */ - int *stat) /* BULKSTAT_RV_... */ +/* + * Return stat information for one inode. + * Return 0 if ok, else errno. + */ +int +xfs_bulkstat_one_int( + struct xfs_mount *mp, /* mount point for filesystem */ + xfs_ino_t ino, /* inode to get data for */ + void __user *buffer, /* buffer to place output in */ + int ubsize, /* size of buffer */ + bulkstat_one_fmt_pf formatter, /* formatter, copy to user */ + xfs_daddr_t bno, /* starting bno of cluster */ + int *ubused, /* bytes used by me */ + int *stat) /* BULKSTAT_RV_... */ { - xfs_icdinode_t *dic; /* dinode core info pointer */ - xfs_inode_t *ip; /* incore inode pointer */ - struct inode *inode; - int error; + struct xfs_icdinode *dic; /* dinode core info pointer */ + struct xfs_inode *ip; /* incore inode pointer */ + struct inode *inode; + struct xfs_bstat *buf; /* return buffer */ + int error = 0; /* error value */ + + *stat = BULKSTAT_RV_NOTHING; + + if (!buffer || xfs_internal_inum(mp, ino)) + return XFS_ERROR(EINVAL); + + buf = kmem_alloc(sizeof(*buf), KM_SLEEP | KM_MAYFAIL); + if (!buf) + return XFS_ERROR(ENOMEM); error = xfs_iget(mp, NULL, ino, XFS_IGET_BULKSTAT, XFS_ILOCK_SHARED, &ip, bno); if (error) { *stat = BULKSTAT_RV_NOTHING; - return error; + goto out_free; } ASSERT(ip != NULL); @@ -123,77 +140,16 @@ xfs_bulkstat_one_iget( buf->bs_blocks = dic->di_nblocks + ip->i_delayed_blks; break; } - xfs_iput(ip, XFS_ILOCK_SHARED); - return error; -} -STATIC void -xfs_bulkstat_one_dinode( - xfs_mount_t *mp, /* mount point for filesystem */ - xfs_ino_t ino, /* inode number to get data for */ - xfs_dinode_t *dic, /* dinode inode pointer */ - xfs_bstat_t *buf) /* return buffer */ -{ - /* - * The inode format changed when we moved the link count and - * made it 32 bits long. If this is an old format inode, - * convert it in memory to look like a new one. If it gets - * flushed to disk we will convert back before flushing or - * logging it. We zero out the new projid field and the old link - * count field. We'll handle clearing the pad field (the remains - * of the old uuid field) when we actually convert the inode to - * the new format. We don't change the version number so that we - * can distinguish this from a real new format inode. - */ - if (dic->di_version == 1) { - buf->bs_nlink = be16_to_cpu(dic->di_onlink); - buf->bs_projid = 0; - } else { - buf->bs_nlink = be32_to_cpu(dic->di_nlink); - buf->bs_projid = be16_to_cpu(dic->di_projid); - } + error = formatter(buffer, ubsize, ubused, buf); - buf->bs_ino = ino; - buf->bs_mode = be16_to_cpu(dic->di_mode); - buf->bs_uid = be32_to_cpu(dic->di_uid); - buf->bs_gid = be32_to_cpu(dic->di_gid); - buf->bs_size = be64_to_cpu(dic->di_size); - buf->bs_atime.tv_sec = be32_to_cpu(dic->di_atime.t_sec); - buf->bs_atime.tv_nsec = be32_to_cpu(dic->di_atime.t_nsec); - buf->bs_mtime.tv_sec = be32_to_cpu(dic->di_mtime.t_sec); - buf->bs_mtime.tv_nsec = be32_to_cpu(dic->di_mtime.t_nsec); - buf->bs_ctime.tv_sec = be32_to_cpu(dic->di_ctime.t_sec); - buf->bs_ctime.tv_nsec = be32_to_cpu(dic->di_ctime.t_nsec); - buf->bs_xflags = xfs_dic2xflags(dic); - buf->bs_extsize = be32_to_cpu(dic->di_extsize) << mp->m_sb.sb_blocklog; - buf->bs_extents = be32_to_cpu(dic->di_nextents); - buf->bs_gen = be32_to_cpu(dic->di_gen); - memset(buf->bs_pad, 0, sizeof(buf->bs_pad)); - buf->bs_dmevmask = be32_to_cpu(dic->di_dmevmask); - buf->bs_dmstate = be16_to_cpu(dic->di_dmstate); - buf->bs_aextents = be16_to_cpu(dic->di_anextents); - buf->bs_forkoff = XFS_DFORK_BOFF(dic); + if (!error) + *stat = BULKSTAT_RV_DIDONE; - switch (dic->di_format) { - case XFS_DINODE_FMT_DEV: - buf->bs_rdev = xfs_dinode_get_rdev(dic); - buf->bs_blksize = BLKDEV_IOSIZE; - buf->bs_blocks = 0; - break; - case XFS_DINODE_FMT_LOCAL: - case XFS_DINODE_FMT_UUID: - buf->bs_rdev = 0; - buf->bs_blksize = mp->m_sb.sb_blocksize; - buf->bs_blocks = 0; - break; - case XFS_DINODE_FMT_EXTENTS: - case XFS_DINODE_FMT_BTREE: - buf->bs_rdev = 0; - buf->bs_blksize = mp->m_sb.sb_blocksize; - buf->bs_blocks = be64_to_cpu(dic->di_nblocks); - break; - } + out_free: + kmem_free(buf); + return error; } /* Return 0 on success or positive error */ @@ -213,118 +169,19 @@ xfs_bulkstat_one_fmt( return 0; } -/* - * Return stat information for one inode. - * Return 0 if ok, else errno. - */ -int /* error status */ -xfs_bulkstat_one_int( - xfs_mount_t *mp, /* mount point for filesystem */ - xfs_ino_t ino, /* inode number to get data for */ - void __user *buffer, /* buffer to place output in */ - int ubsize, /* size of buffer */ - bulkstat_one_fmt_pf formatter, /* formatter, copy to user */ - xfs_daddr_t bno, /* starting bno of inode cluster */ - int *ubused, /* bytes used by me */ - void *dibuff, /* on-disk inode buffer */ - int *stat) /* BULKSTAT_RV_... */ -{ - xfs_bstat_t *buf; /* return buffer */ - int error = 0; /* error value */ - xfs_dinode_t *dip; /* dinode inode pointer */ - - dip = (xfs_dinode_t *)dibuff; - *stat = BULKSTAT_RV_NOTHING; - - if (!buffer || xfs_internal_inum(mp, ino)) - return XFS_ERROR(EINVAL); - - buf = kmem_alloc(sizeof(*buf), KM_SLEEP); - - if (dip == NULL) { - /* We're not being passed a pointer to a dinode. This happens - * if BULKSTAT_FG_IGET is selected. Do the iget. - */ - error = xfs_bulkstat_one_iget(mp, ino, bno, buf, stat); - if (error) - goto out_free; - } else { - xfs_bulkstat_one_dinode(mp, ino, dip, buf); - } - - error = formatter(buffer, ubsize, ubused, buf); - if (error) - goto out_free; - - *stat = BULKSTAT_RV_DIDONE; - - out_free: - kmem_free(buf); - return error; -} - int xfs_bulkstat_one( xfs_mount_t *mp, /* mount point for filesystem */ xfs_ino_t ino, /* inode number to get data for */ void __user *buffer, /* buffer to place output in */ int ubsize, /* size of buffer */ - void *private_data, /* my private data */ xfs_daddr_t bno, /* starting bno of inode cluster */ int *ubused, /* bytes used by me */ - void *dibuff, /* on-disk inode buffer */ int *stat) /* BULKSTAT_RV_... */ { return xfs_bulkstat_one_int(mp, ino, buffer, ubsize, xfs_bulkstat_one_fmt, bno, - ubused, dibuff, stat); -} - -/* - * Test to see whether we can use the ondisk inode directly, based - * on the given bulkstat flags, filling in dipp accordingly. - * Returns zero if the inode is dodgey. - */ -STATIC int -xfs_bulkstat_use_dinode( - xfs_mount_t *mp, - int flags, - xfs_buf_t *bp, - int clustidx, - xfs_dinode_t **dipp) -{ - xfs_dinode_t *dip; - unsigned int aformat; - - *dipp = NULL; - if (!bp || (flags & BULKSTAT_FG_IGET)) - return 1; - dip = (xfs_dinode_t *) - xfs_buf_offset(bp, clustidx << mp->m_sb.sb_inodelog); - /* - * Check the buffer containing the on-disk inode for di_mode == 0. - * This is to prevent xfs_bulkstat from picking up just reclaimed - * inodes that have their in-core state initialized but not flushed - * to disk yet. This is a temporary hack that would require a proper - * fix in the future. - */ - if (be16_to_cpu(dip->di_magic) != XFS_DINODE_MAGIC || - !XFS_DINODE_GOOD_VERSION(dip->di_version) || - !dip->di_mode) - return 0; - if (flags & BULKSTAT_FG_QUICK) { - *dipp = dip; - return 1; - } - /* BULKSTAT_FG_INLINE: if attr fork is local, or not there, use it */ - aformat = dip->di_aformat; - if ((XFS_DFORK_Q(dip) == 0) || - (aformat == XFS_DINODE_FMT_LOCAL) || - (aformat == XFS_DINODE_FMT_EXTENTS && !dip->di_anextents)) { - *dipp = dip; - return 1; - } - return 1; + ubused, stat); } #define XFS_BULKSTAT_UBLEFT(ubleft) ((ubleft) >= statstruct_size) @@ -338,10 +195,8 @@ xfs_bulkstat( xfs_ino_t *lastinop, /* last inode returned */ int *ubcountp, /* size of buffer/count returned */ bulkstat_one_pf formatter, /* func that'd fill a single buf */ - void *private_data,/* private data for formatter */ size_t statstruct_size, /* sizeof struct filling */ char __user *ubuffer, /* buffer with inode stats */ - int flags, /* defined in xfs_itable.h */ int *done) /* 1 if there are more stats to get */ { xfs_agblock_t agbno=0;/* allocation group block number */ @@ -376,14 +231,12 @@ xfs_bulkstat( int ubelem; /* spaces used in user's buffer */ int ubused; /* bytes used by formatter */ xfs_buf_t *bp; /* ptr to on-disk inode cluster buf */ - xfs_dinode_t *dip; /* ptr into bp for specific inode */ /* * Get the last inode value, see if there's nothing to do. */ ino = (xfs_ino_t)*lastinop; lastino = ino; - dip = NULL; agno = XFS_INO_TO_AGNO(mp, ino); agino = XFS_INO_TO_AGINO(mp, ino); if (agno >= mp->m_sb.sb_agcount || @@ -608,37 +461,6 @@ xfs_bulkstat( irbp->ir_startino) + ((chunkidx & nimask) >> mp->m_sb.sb_inopblog); - - if (flags & (BULKSTAT_FG_QUICK | - BULKSTAT_FG_INLINE)) { - int offset; - - ino = XFS_AGINO_TO_INO(mp, agno, - agino); - bno = XFS_AGB_TO_DADDR(mp, agno, - agbno); - - /* - * Get the inode cluster buffer - */ - if (bp) - xfs_buf_relse(bp); - - error = xfs_inotobp(mp, NULL, ino, &dip, - &bp, &offset, - XFS_IGET_BULKSTAT); - - if (!error) - clustidx = offset / mp->m_sb.sb_inodesize; - if (XFS_TEST_ERROR(error != 0, - mp, XFS_ERRTAG_BULKSTAT_READ_CHUNK, - XFS_RANDOM_BULKSTAT_READ_CHUNK)) { - bp = NULL; - ubleft = 0; - rval = error; - break; - } - } } ino = XFS_AGINO_TO_INO(mp, agno, agino); bno = XFS_AGB_TO_DADDR(mp, agno, agbno); @@ -654,35 +476,13 @@ xfs_bulkstat( * when the chunk is used up. */ irbp->ir_freecount++; - if (!xfs_bulkstat_use_dinode(mp, flags, bp, - clustidx, &dip)) { - lastino = ino; - continue; - } - /* - * If we need to do an iget, cannot hold bp. - * Drop it, until starting the next cluster. - */ - if ((flags & BULKSTAT_FG_INLINE) && !dip) { - if (bp) - xfs_buf_relse(bp); - bp = NULL; - } /* * Get the inode and fill in a single buffer. - * BULKSTAT_FG_QUICK uses dip to fill it in. - * BULKSTAT_FG_IGET uses igets. - * BULKSTAT_FG_INLINE uses dip if we have an - * inline attr fork, else igets. - * See: xfs_bulkstat_one & xfs_dm_bulkstat_one. - * This is also used to count inodes/blks, etc - * in xfs_qm_quotacheck. */ ubused = statstruct_size; - error = formatter(mp, ino, ubufp, - ubleft, private_data, - bno, &ubused, dip, &fmterror); + error = formatter(mp, ino, ubufp, ubleft, bno, + &ubused, &fmterror); if (fmterror == BULKSTAT_RV_NOTHING) { if (error && error != ENOENT && error != EINVAL) { @@ -775,7 +575,7 @@ xfs_bulkstat_single( ino = (xfs_ino_t)*lastinop; error = xfs_bulkstat_one(mp, ino, buffer, sizeof(xfs_bstat_t), - NULL, 0, NULL, NULL, &res); + 0, NULL, &res); if (error) { /* * Special case way failed, do it the "long" way @@ -784,8 +584,7 @@ xfs_bulkstat_single( (*lastinop)--; count = 1; if (xfs_bulkstat(mp, lastinop, &count, xfs_bulkstat_one, - NULL, sizeof(xfs_bstat_t), buffer, - BULKSTAT_FG_IGET, done)) + sizeof(xfs_bstat_t), buffer, done)) return error; if (count == 0 || (xfs_ino_t)*lastinop != ino) return error == EFSCORRUPTED ? diff --git a/fs/xfs/xfs_itable.h b/fs/xfs/xfs_itable.h index 20792bf..fea0339 100644 --- a/fs/xfs/xfs_itable.h +++ b/fs/xfs/xfs_itable.h @@ -27,10 +27,8 @@ typedef int (*bulkstat_one_pf)(struct xfs_mount *mp, xfs_ino_t ino, void __user *buffer, int ubsize, - void *private_data, xfs_daddr_t bno, int *ubused, - void *dip, int *stat); /* @@ -41,13 +39,6 @@ typedef int (*bulkstat_one_pf)(struct xfs_mount *mp, #define BULKSTAT_RV_GIVEUP 2 /* - * Values for bulkstat flag argument. - */ -#define BULKSTAT_FG_IGET 0x1 /* Go through the buffer cache */ -#define BULKSTAT_FG_QUICK 0x2 /* No iget, walk the dinode cluster */ -#define BULKSTAT_FG_INLINE 0x4 /* No iget if inline attrs */ - -/* * Return stat information in bulk (by-inode) for the filesystem. */ int /* error status */ @@ -56,10 +47,8 @@ xfs_bulkstat( xfs_ino_t *lastino, /* last inode returned */ int *count, /* size of buffer/count returned */ bulkstat_one_pf formatter, /* func that'd fill a single buf */ - void *private_data, /* private data for formatter */ size_t statstruct_size,/* sizeof struct that we're filling */ char __user *ubuffer,/* buffer with inode stats */ - int flags, /* flag to control access method */ int *done); /* 1 if there are more stats to get */ int @@ -84,7 +73,6 @@ xfs_bulkstat_one_int( bulkstat_one_fmt_pf formatter, xfs_daddr_t bno, int *ubused, - void *dibuff, int *stat); int @@ -93,10 +81,8 @@ xfs_bulkstat_one( xfs_ino_t ino, void __user *buffer, int ubsize, - void *private_data, xfs_daddr_t bno, int *ubused, - void *dibuff, int *stat); typedef int (*inumbers_fmt_pf)( -- 1.7.1 From xiaowei.hu@oracle.com Sun Jun 20 21:53:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5L2rE5R097179 for ; Sun, 20 Jun 2010 21:53:15 -0500 X-ASG-Debug-ID: 1277088953-674303890000-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 A92171E11B48 for ; Sun, 20 Jun 2010 19:55:53 -0700 (PDT) Received: from rcsinet10.oracle.com (rcsinet10.oracle.com [148.87.113.121]) by cuda.sgi.com with ESMTP id nByTQobZRqHCAvtC for ; Sun, 20 Jun 2010 19:55:53 -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.2) with ESMTP id o5L2tpd7013431 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 21 Jun 2010 02:55:52 GMT Received: from acsmt355.oracle.com (acsmt355.oracle.com [141.146.40.155]) by rcsinet15.oracle.com (Switch-3.4.2/Switch-3.4.1) with ESMTP id o5L2tkFM024706 for ; Mon, 21 Jun 2010 02:55:46 GMT Received: from abhmt001.oracle.com by acsmt355.oracle.com with ESMTP id 358591191277088921; Sun, 20 Jun 2010 19:55:21 -0700 Received: from [10.182.120.139] (/10.182.120.139) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Sun, 20 Jun 2010 19:55:21 -0700 X-ASG-Orig-Subj: segment fault when running xfs_check -s Subject: segment fault when running xfs_check -s From: xiaowei hu Reply-To: xiaowei.hu@oracle.com To: xfs@oss.sgi.com Cc: wen.gang.wang@oracle.com Content-Type: text/plain; charset="UTF-8" Organization: Oracle Date: Mon, 21 Jun 2010 10:55:18 +0800 Message-ID: <1277088918.20616.81.camel@redfuture-desktop> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-Auth-Type: Internal IP X-Source-IP: rcsinet15.oracle.com [148.87.113.117] X-CT-RefId: str=0001.0A090204.4C1ED4B9.0043:SCFMA4539811,ss=1,fgs=0 X-Barracuda-Connect: rcsinet10.oracle.com[148.87.113.121] X-Barracuda-Start-Time: 1277088954 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33098 Rule breakdown below pts rule 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, Recently I was playing with xfsprogs, and did some test on xfs_check tools in this mothod: 1.make a xfs fs on one partition. mkfs.xfs -f /dev/sda2 2.randomly modify some blocks on this volume using xfs_db. xfs_db -x -c blockget -c "blocktrash -3 -s 36 -n 81" /dev/sda2 3.run xfs_check -s xfs_check -s /dev/sda2 the output saying: [root@test1 ~]# xfs_check -s /dev/sda2 bad version number 0x78 for inode 135 bad magic number 0xa855 for inode 154 bad magic number 0x5024 for inode 165 /usr/local/bin/xfs_check: line 28: 769 Segmentation fault xfs_db $DBOPTS -F -i -p xfs_check -c "blockget$OPTS" $1 if I run xfs_check without -s option, don't have this fault. Is this a known problem? I tried the latest code ,also have this problem. thanks, Xiaowei From xfs@tlinx.org Sun Jun 20 23:32:46 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5L4Wj6U100789 for ; Sun, 20 Jun 2010 23:32:45 -0500 X-ASG-Debug-ID: 1277094918-2b1d030a0000-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 27FE73EE4D1 for ; Sun, 20 Jun 2010 21:35:20 -0700 (PDT) Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id EvNOnm0D8GBRzwbx for ; Sun, 20 Jun 2010 21:35:20 -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 o5L4ZDir026571 for ; Sun, 20 Jun 2010 21:35:15 -0700 Message-ID: <4C1EEC01.9090509@tlinx.org> Date: Sun, 20 Jun 2010 21:35:13 -0700 From: "Linda A. Walsh" User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: xfs partition layout and using xfs_growfs Subject: xfs partition layout and using xfs_growfs 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: 1277094925 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0024 1.0000 -2.0055 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.60 X-Barracuda-Spam-Status: No, SCORE=-1.60 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=SUBJECT_FUZZY_TION X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33104 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.41 SUBJECT_FUZZY_TION Attempt to obfuscate words in Subject: X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Is there any difference in a file systems layout and efficiency between to xfs fs's of the same size, but where one was created at size '100%', where the other was created at size 50%, but then grown iteratively to 60, 70, 80, 90 and then 100% over time as it filled? Would the final file systems look pretty much the same and have roughly the same performance characteristics? Assume, for sake of argument, that the file system was grown before space got tight enough to cause any severe large file fragmentation. I've been under the impression that one gained some performance benefits if one laid out the whole file system at once is that a mis-impression? That asked/said...is there any work underway to create an xfs_shrinkfs, so that one could go the other way? Thanks, Linda From SRS0+8/6Q+21+fromorbit.com=david@internode.on.net Mon Jun 21 00:35: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_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5L5Zdv0105773 for ; Mon, 21 Jun 2010 00:35:39 -0500 X-ASG-Debug-ID: 1277098697-279402b50000-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 F1E2F150F615 for ; Sun, 20 Jun 2010 22:38:17 -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 o1pLWImu0LqKI8b7 for ; Sun, 20 Jun 2010 22:38:17 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 17036326-1927428 for multiple; Mon, 21 Jun 2010 15:08:10 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OQZhr-0003Me-Tu; Mon, 21 Jun 2010 15:38:03 +1000 Date: Mon, 21 Jun 2010 15:38:03 +1000 From: Dave Chinner To: xiaowei hu Cc: xfs@oss.sgi.com, wen.gang.wang@oracle.com X-ASG-Orig-Subj: Re: segment fault when running xfs_check -s Subject: Re: segment fault when running xfs_check -s Message-ID: <20100621053803.GK6590@dastard> References: <1277088918.20616.81.camel@redfuture-desktop> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1277088918.20616.81.camel@redfuture-desktop> 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: 1277098699 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33108 Rule breakdown below pts rule 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 21, 2010 at 10:55:18AM +0800, xiaowei hu wrote: > Hi, > > Recently I was playing with xfsprogs, and did some test on xfs_check > tools in this mothod: > 1.make a xfs fs on one partition. > mkfs.xfs -f /dev/sda2 > 2.randomly modify some blocks on this volume using xfs_db. > xfs_db -x -c blockget -c "blocktrash -3 -s 36 -n 81" /dev/sda2 > 3.run xfs_check -s > xfs_check -s /dev/sda2 > > the output saying: > [root@test1 ~]# xfs_check -s /dev/sda2 > bad version number 0x78 for inode 135 > bad magic number 0xa855 for inode 154 > bad magic number 0x5024 for inode 165 > /usr/local/bin/xfs_check: line 28: 769 Segmentation fault xfs_db > $DBOPTS -F -i -p xfs_check -c "blockget$OPTS" $1 > > if I run xfs_check without -s option, don't have this fault. > > Is this a known problem? No. > I tried the latest code ,also have this problem. Yeah, the code determining whether to output a message is broken: 2651 if (!isfree) { 2652 id = find_inode(ino, 1); 2653 bno = XFS_INO_TO_FSB(mp, ino); 2654 blkmap = NULL; 2655 } find_inode() checks a list created by the "-i " command line option, so will always return NULL for this test case. Most of the checks do this: 2657 if (!sflag || isfree || id->ilist || CHECK_BLIST(bno)) sflag is set by the "-s" command line option, which is why this problem requires that to be set - the output checks don't get past this otherwise. isfree is a parameter passed into to say whether the inode is allocated or not. The code hence assumes that if !isfree, then id != NULL, which is certainly not the case. Hence it can blow up if id = NULL. The line it crashed on: 2670 if (isfree) { 2671 if (idic.di_nblocks != 0) { 2672 >>>>>> if (!sflag || id->ilist || CHECK_BLIST(bno)) Looks like a clear case of copy-n-paste error - if isfree is set, the id _must_ be null and we go kaboom. It looks like none of the code in this function actually checks for whether id is valid or not after find_inode and dereferencing the reurn pointer. The patch below should fix the problem. Cheers, Dave. -- Dave Chinner david@fromorbit.com --- db/check.c | 29 ++++++++++++++++------------- 1 files changed, 16 insertions(+), 13 deletions(-) diff --git a/db/check.c b/db/check.c index 7620d9c..e0dcf63 100644 --- a/db/check.c +++ b/db/check.c @@ -2619,6 +2619,7 @@ process_inode( xfs_qcnt_t ic = 0; xfs_qcnt_t rc = 0; xfs_dqid_t dqprid; + int v = 0; static char okfmts[] = { 0, /* type 0 unused */ 1 << XFS_DINODE_FMT_DEV, /* FIFO */ @@ -2653,15 +2654,16 @@ process_inode( bno = XFS_INO_TO_FSB(mp, ino); blkmap = NULL; } + v = (!sflag || (id && id->ilist) || CHECK_BLIST(bno)); if (idic.di_magic != XFS_DINODE_MAGIC) { - if (!sflag || isfree || id->ilist || CHECK_BLIST(bno)) + if (isfree || v) dbprintf(_("bad magic number %#x for inode %lld\n"), idic.di_magic, ino); error++; return; } if (!XFS_DINODE_GOOD_VERSION(idic.di_version)) { - if (!sflag || isfree || id->ilist || CHECK_BLIST(bno)) + if (isfree || v) dbprintf(_("bad version number %#x for inode %lld\n"), idic.di_version, ino); error++; @@ -2669,7 +2671,7 @@ process_inode( } if (isfree) { if (idic.di_nblocks != 0) { - if (!sflag || id->ilist || CHECK_BLIST(bno)) + if (v) dbprintf(_("bad nblocks %lld for free inode " "%lld\n"), idic.di_nblocks, ino); @@ -2680,21 +2682,22 @@ process_inode( else nlink = idic.di_nlink; if (nlink != 0) { - if (!sflag || id->ilist || CHECK_BLIST(bno)) + if (v) dbprintf(_("bad nlink %d for free inode %lld\n"), nlink, ino); error++; } if (idic.di_mode != 0) { - if (!sflag || id->ilist || CHECK_BLIST(bno)) + if (v) dbprintf(_("bad mode %#o for free inode %lld\n"), idic.di_mode, ino); error++; } return; } + if (be32_to_cpu(dip->di_next_unlinked) != NULLAGINO) { - if (!sflag || isfree || id->ilist || CHECK_BLIST(bno)) + if (v) dbprintf(_("bad next unlinked %#x for inode %lld\n"), be32_to_cpu(dip->di_next_unlinked), ino); error++; @@ -2704,27 +2707,27 @@ process_inode( */ if ((((idic.di_mode & S_IFMT) >> 12) > 15) || (!(okfmts[(idic.di_mode & S_IFMT) >> 12] & (1 << idic.di_format)))) { - if (!sflag || id->ilist || CHECK_BLIST(bno)) + if (v) dbprintf(_("bad format %d for inode %lld type %#o\n"), idic.di_format, id->ino, idic.di_mode & S_IFMT); error++; return; } if ((unsigned int)XFS_DFORK_ASIZE(dip, mp) >= XFS_LITINO(mp)) { - if (!sflag || id->ilist) + if (v) dbprintf(_("bad fork offset %d for inode %lld\n"), idic.di_forkoff, id->ino); error++; return; } if ((unsigned int)idic.di_aformat > XFS_DINODE_FMT_BTREE) { - if (!sflag || id->ilist) + if (v) dbprintf(_("bad attribute format %d for inode %lld\n"), idic.di_aformat, id->ino); error++; return; } - if (verbose || id->ilist || CHECK_BLIST(bno)) + if (verbose || v) dbprintf(_("inode %lld mode %#o fmt %s " "afmt %s " "nex %d anex %d nblk %lld sz %lld%s%s%s%s%s%s%s\n"), @@ -2844,20 +2847,20 @@ process_inode( } totblocks = totdblocks + totiblocks + atotdblocks + atotiblocks; if (totblocks != idic.di_nblocks) { - if (!sflag || id->ilist || CHECK_BLIST(bno)) + if (v) dbprintf(_("bad nblocks %lld for inode %lld, counted " "%lld\n"), idic.di_nblocks, id->ino, totblocks); error++; } if (nextents != idic.di_nextents) { - if (!sflag || id->ilist || CHECK_BLIST(bno)) + if (v) dbprintf(_("bad nextents %d for inode %lld, counted %d\n"), idic.di_nextents, id->ino, nextents); error++; } if (anextents != idic.di_anextents) { - if (!sflag || id->ilist || CHECK_BLIST(bno)) + if (v) dbprintf(_("bad anextents %d for inode %lld, counted " "%d\n"), idic.di_anextents, id->ino, anextents); From SRS0+fGoV+21+fromorbit.com=david@internode.on.net Mon Jun 21 00:51: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 o5L5p7Ag106327 for ; Mon, 21 Jun 2010 00:51:07 -0500 X-ASG-Debug-ID: 1277099868-0a9a03370000-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 BCA6414AAD0C for ; Sun, 20 Jun 2010 22:57:49 -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 AtyJ20idbt4xxlU5 for ; Sun, 20 Jun 2010 22:57:49 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28746407-1927428 for multiple; Mon, 21 Jun 2010 15:23:43 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OQZx0-0003NL-3N; Mon, 21 Jun 2010 15:53:42 +1000 Date: Mon, 21 Jun 2010 15:53:42 +1000 From: Dave Chinner To: "Linda A. Walsh" Cc: xfs-oss X-ASG-Orig-Subj: Re: xfs partition layout and using xfs_growfs Subject: Re: xfs partition layout and using xfs_growfs Message-ID: <20100621055342.GL6590@dastard> References: <4C1EEC01.9090509@tlinx.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C1EEC01.9090509@tlinx.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: 1277099870 X-Barracuda-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.51 X-Barracuda-Spam-Status: No, SCORE=-1.51 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA085, SUBJECT_FUZZY_TION X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33109 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.41 SUBJECT_FUZZY_TION Attempt to obfuscate words in Subject: 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 Sun, Jun 20, 2010 at 09:35:13PM -0700, Linda A. Walsh wrote: > > Is there any difference in a file systems layout and efficiency between > to xfs fs's of the same size, but where one was created at size > '100%', where the other was created at size 50%, but then grown > iteratively to 60, 70, 80, 90 and then 100% over time as it filled? Yes. > Would the final file systems look pretty much the same >From a structural perspective, it depends on the size of the AGs in the initial filesystem. If the filesystem was big enough to begin with (i.e. using maximally sized AGs at mkfs time) then growing it will result in a layout exactly the same as if it was mkfs'd at full size. However, the allocation patterns will be significantly different between the two filesystems, so there will be no similarity in data layout between the two different filesystems. > and have roughly the > same performance characteristics? See previous answer. > Assume, for sake of argument, that the > file system was grown before space got tight enough to cause any > severe large file fragmentation. See previous answer. ;) > I've been under the impression that one gained some performance benefits if one > laid out the whole file system at once is that a mis-impression? I wouldn't say you "gain performance benefits" by starting with a larger filesystem, more that a grown filesystem has different aging characteristics to one that has not been grown. See previous answer. ;) > That asked/said...is there any work underway to create an xfs_shrinkfs, so > that one could go the other way? http://xfs.org/index.php/Shrinking_Support Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+3dae0f5530bf0d1cca01+2493+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 21 02:18:42 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5L7Idrt110170 for ; Mon, 21 Jun 2010 02:18:42 -0500 X-ASG-Debug-ID: 1277105123-62f501290000-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 487C414AAB62 for ; Mon, 21 Jun 2010 00:25:23 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id 96eXZFKNuIP6ubyM for ; Mon, 21 Jun 2010 00:25:23 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OQbJm-0002wI-A6; Mon, 21 Jun 2010 07:21:18 +0000 Date: Mon, 21 Jun 2010 03:21:18 -0400 From: Christoph Hellwig To: Mario Bachmann Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: vmalloc, xfs_buf_get: failed to map pages Subject: Re: vmalloc, xfs_buf_get: failed to map pages Message-ID: <20100621072118.GA1361@infradead.org> References: <20100619150119.3ce64102@x2.grafnetz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100619150119.3ce64102@x2.grafnetz> 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: 1277105124 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sat, Jun 19, 2010 at 03:01:19PM +0200, Mario Bachmann wrote: > Hello, > > on a 32bit machine, I have big problems with Linux 2.6.34. > With Linux 2.6.33.4 everything runs fine. > > I do not know where to search for known bugs in xfs. > > /var/log/messages shows a lot of lines: > > Jun 19 11:43:15 amd2000 kernel: vmap allocation for size 4194304 failed: use vmalloc= to increase size. > Jun 19 11:43:15 amd2000 kernel: xfs_buf_get: failed to map pages > > What to to? Strange. There have been no fixes to the vmap allocator nor to the XFS using this. What other modules are you ising? Maybe they increased their amount of used vmalloc space. For now the only thing you can do is using the vmalloc= kernel paramter to increase the vmalloc space. From BATV+3dae0f5530bf0d1cca01+2493+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 21 02:18: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 (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5L7IuaC110194 for ; Mon, 21 Jun 2010 02:18:57 -0500 X-ASG-Debug-ID: 1277105141-479003950000-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 B21BF14AAB67 for ; Mon, 21 Jun 2010 00:25:41 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id hda3txC2yEf7RXXm for ; Mon, 21 Jun 2010 00:25:41 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OQbK1-0002zW-Ro; Mon, 21 Jun 2010 07:21:33 +0000 Date: Mon, 21 Jun 2010 03:21:33 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfsqa: test 214 leaves files around that cause 236 to fail Subject: Re: [PATCH] xfsqa: test 214 leaves files around that cause 236 to fail Message-ID: <20100621072133.GB1361@infradead.org> References: <1277077378-17927-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1277077378-17927-1-git-send-email-david@fromorbit.com> 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: 1277105141 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Jun 21, 2010 at 09:42:58AM +1000, Dave Chinner wrote: > From: Dave Chinner > > Test 214 and 236 use the same file names for test files in the TEST > filesystem and don't check/create clean initial test state. Hence if > you run 214 then 236, 236 will fail with: > > +link: cannot create link `/mnt/test/ouch2' to `/mnt/test/ouch': File exists > +ctime: 1277076527 -> 1277076527 > +Fatal error: ctime not updated after link > > Ensure that both tests clean up after themselves properly and also > ensure a clean state before they start. Looks good, Reviewed-by: Christoph Hellwig From BATV+3dae0f5530bf0d1cca01+2493+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 21 02:19:09 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5L7J81r110216 for ; Mon, 21 Jun 2010 02:19:09 -0500 X-ASG-Debug-ID: 1277105153-62bf014e0000-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 E572E14AAB6E for ; Mon, 21 Jun 2010 00:25:53 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id 05pW5tjYoTazdF2b for ; Mon, 21 Jun 2010 00:25:53 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OQbKG-00032p-BM; Mon, 21 Jun 2010 07:21:48 +0000 Date: Mon, 21 Jun 2010 03:21:48 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com, security@kernel.org X-ASG-Orig-Subj: Re: [PATCH 2/4] xfs: validate untrusted inode numbers during lookup Subject: Re: [PATCH 2/4] xfs: validate untrusted inode numbers during lookup Message-ID: <20100621072148.GC1361@infradead.org> References: <1277078341-19087-1-git-send-email-david@fromorbit.com> <1277078341-19087-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1277078341-19087-3-git-send-email-david@fromorbit.com> 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: 1277105153 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Looks good, Reviewed-by: Christoph Hellwig From BATV+3dae0f5530bf0d1cca01+2493+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 21 02:19:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5L7JJCN110236 for ; Mon, 21 Jun 2010 02:19:20 -0500 X-ASG-Debug-ID: 1277104919-7813011b0000-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 74B583EEE4B for ; Mon, 21 Jun 2010 00:22:00 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id R3UkqkFxWxGgH7UW for ; Mon, 21 Jun 2010 00:22:00 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OQbKR-00034M-Md; Mon, 21 Jun 2010 07:21:59 +0000 Date: Mon, 21 Jun 2010 03:21:59 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com, security@kernel.org X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: rename XFS_IGET_BULKSTAT to XFS_IGET_UNTRUSTED Subject: Re: [PATCH 3/4] xfs: rename XFS_IGET_BULKSTAT to XFS_IGET_UNTRUSTED Message-ID: <20100621072159.GD1361@infradead.org> References: <1277078341-19087-1-git-send-email-david@fromorbit.com> <1277078341-19087-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1277078341-19087-4-git-send-email-david@fromorbit.com> 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: 1277104920 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Jun 21, 2010 at 09:59:00AM +1000, Dave Chinner wrote: > From: Dave Chinner > > Inode numbers may come from somewhere external to the filesystem > (e.g. file handles, bulkstat information) and so are inherently > untrusted. Rename the flag we use for these lookups to make it > obvious we are doing a lookup of an untrusted inode number and need > to verify it completely before trying to read it from disk. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From BATV+3dae0f5530bf0d1cca01+2493+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 21 02:19: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 (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5L7Jamf110255 for ; Mon, 21 Jun 2010 02:19:36 -0500 X-ASG-Debug-ID: 1277104936-79d702590000-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 29D7E151077E for ; Mon, 21 Jun 2010 00:22:17 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id fHGABwUgyHnFIwah for ; Mon, 21 Jun 2010 00:22:17 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OQbKi-00036w-PO; Mon, 21 Jun 2010 07:22:16 +0000 Date: Mon, 21 Jun 2010 03:22:16 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com, security@kernel.org X-ASG-Orig-Subj: Re: [PATCH 4/4] xfs: remove block number from inode lookup code Subject: Re: [PATCH 4/4] xfs: remove block number from inode lookup code Message-ID: <20100621072216.GE1361@infradead.org> References: <1277078341-19087-1-git-send-email-david@fromorbit.com> <1277078341-19087-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1277078341-19087-5-git-send-email-david@fromorbit.com> 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: 1277104937 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Jun 21, 2010 at 09:59:01AM +1000, Dave Chinner wrote: > From: Dave Chinner > > The block number comes from bulkstat based inode lookups to shortcut > the mapping calculations. We ar enot able to trust anything from > bulkstat, so drop the block number as well so that the correct > lookups and mappings are always done. Looks good, Reviewed-by: Christoph Hellwig From BATV+3dae0f5530bf0d1cca01+2493+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 21 02:40:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5L7ejbh111201 for ; Mon, 21 Jun 2010 02:40:45 -0500 X-ASG-Debug-ID: 1277106205-77f701490000-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 EBCE23EEF02 for ; Mon, 21 Jun 2010 00:43:25 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id d64XaIfGwQByakKq for ; Mon, 21 Jun 2010 00:43:25 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OQbfB-0000PP-D7; Mon, 21 Jun 2010 07:43:25 +0000 Date: Mon, 21 Jun 2010 03:43:25 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfsqa: test open_by_handle() on unlinked and freed inode clusters V2 Subject: Re: [PATCH] xfsqa: test open_by_handle() on unlinked and freed inode clusters V2 Message-ID: <20100621074325.GA1301@infradead.org> References: <1276756659-12338-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1276756659-12338-1-git-send-email-david@fromorbit.com> 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: 1277106205 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Looks good, Reviewed-by: Christoph Hellwig From BATV+3dae0f5530bf0d1cca01+2493+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 21 03:33: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 o5L8XS4u113450 for ; Mon, 21 Jun 2010 03:33:28 -0500 X-ASG-Debug-ID: 1277109613-62d603180000-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 686881454783 for ; Mon, 21 Jun 2010 01:40:13 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id IpqHqIxhCYHRC36P for ; Mon, 21 Jun 2010 01:40:13 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OQcUA-0007Y9-MO; Mon, 21 Jun 2010 08:36:06 +0000 Message-Id: <20100621083606.569096949@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 21 Jun 2010 04:35:45 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: Eric Sandeen X-ASG-Orig-Subj: [PATCH 02/12] xfs: fix corruption case for block size < page size Subject: [PATCH 02/12] xfs: fix corruption case for block size < page size References: <20100621083543.125860679@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: 1277109613 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean 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 Reviewed-by: Dave Chinner 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+3dae0f5530bf0d1cca01+2493+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 21 03:33:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5L8XQk1113434 for ; Mon, 21 Jun 2010 03:33:28 -0500 X-ASG-Debug-ID: 1277109367-136f02150000-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 4735815113FF for ; Mon, 21 Jun 2010 01:36:07 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 9sE7BUsnNV2zaELh for ; Mon, 21 Jun 2010 01:36:07 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OQcUA-0007Ye-TL for xfs@oss.sgi.com; Mon, 21 Jun 2010 08:36:06 +0000 Message-Id: <20100621083606.767195918@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 21 Jun 2010 04:35:46 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 03/12] xfs: simplify xfs_vm_releasepage Subject: [PATCH 03/12] xfs: simplify xfs_vm_releasepage References: <20100621083543.125860679@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: 1277109367 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 Reviewed-by: Dave Chinner 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+3dae0f5530bf0d1cca01+2493+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 21 03:33:29 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5L8XSip113447 for ; Mon, 21 Jun 2010 03:33:28 -0500 X-ASG-Debug-ID: 1277109368-136f02160000-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 9D1CF15113FF for ; Mon, 21 Jun 2010 01:36:08 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 4rsK6OPCc4I2jG3m for ; Mon, 21 Jun 2010 01:36:08 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OQcUC-0007d3-AY for xfs@oss.sgi.com; Mon, 21 Jun 2010 08:36:08 +0000 Message-Id: <20100621083608.249757129@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 21 Jun 2010 04:35:54 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 11/12] xfs: remove xfs_iput Subject: [PATCH 11/12] xfs: remove xfs_iput References: <20100621083543.125860679@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-remove-xfs_iput 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: 1277109368 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean xfs_iput is just a small wrapper for xfs_iunlock + IRELE. Having this out of line wrapper means the trace events in those two can't track their caller properly. So just remove the wrapper and opencode the unlock + rele in the few callers. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_iget.c =================================================================== --- xfs.orig/fs/xfs/xfs_iget.c 2010-06-19 23:06:59.269003778 +0200 +++ xfs/fs/xfs/xfs_iget.c 2010-06-19 23:08:14.611253952 +0200 @@ -418,23 +418,6 @@ out_error_or_again: } /* - * Decrement reference count of an inode structure and unlock it. - * - * ip -- the inode being released - * lock_flags -- this parameter indicates the inode's locks to be - * to be released. See the comment on xfs_iunlock() for a list - * of valid values. - */ -void -xfs_iput(xfs_inode_t *ip, - uint lock_flags) -{ - xfs_itrace_entry(ip); - 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/quota/xfs_qm.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm.c 2010-06-19 23:06:53.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_qm.c 2010-06-19 23:08:14.612254022 +0200 @@ -1662,7 +1662,8 @@ xfs_qm_dqusage_adjust( * making us disable quotas for the file system. */ if ((error = xfs_qm_dqget_noattach(ip, &udqp, &gdqp))) { - xfs_iput(ip, XFS_ILOCK_EXCL); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + IRELE(ip); *res = BULKSTAT_RV_GIVEUP; return error; } @@ -1675,7 +1676,8 @@ xfs_qm_dqusage_adjust( * Walk thru the extent list and count the realtime blocks. */ if ((error = xfs_qm_get_rtblks(ip, &rtblks))) { - xfs_iput(ip, XFS_ILOCK_EXCL); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + IRELE(ip); if (udqp) xfs_qm_dqput(udqp); if (gdqp) Index: xfs/fs/xfs/quota/xfs_qm_syscalls.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_syscalls.c 2010-06-19 23:06:53.000000000 +0200 +++ xfs/fs/xfs/quota/xfs_qm_syscalls.c 2010-06-19 23:08:14.613254161 +0200 @@ -861,8 +861,9 @@ xfs_dqrele_inode( xfs_qm_dqrele(ip->i_gdquot); ip->i_gdquot = NULL; } - xfs_iput(ip, XFS_ILOCK_EXCL); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + IRELE(ip); return 0; } @@ -1129,7 +1130,8 @@ xfs_qm_internalqcheck_adjust( * of those now. */ if (! ipreleased) { - xfs_iput(ip, lock_flags); + xfs_iunlock(ip, lock_flags); + IRELE(ip); ipreleased = B_TRUE; goto again; } @@ -1146,7 +1148,8 @@ xfs_qm_internalqcheck_adjust( ASSERT(gd); xfs_qm_internalqcheck_dqadjust(ip, gd); } - xfs_iput(ip, lock_flags); + xfs_iunlock(ip, lock_flags); + IRELE(ip); *res = BULKSTAT_RV_DIDONE; return (0); } Index: xfs/fs/xfs/xfs_inode.h =================================================================== --- xfs.orig/fs/xfs/xfs_inode.h 2010-06-19 23:06:59.000000000 +0200 +++ xfs/fs/xfs/xfs_inode.h 2010-06-19 23:08:14.618253882 +0200 @@ -443,7 +443,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 **); -void xfs_iput(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); Index: xfs/fs/xfs/xfs_inode_item.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode_item.c 2010-06-19 23:06:49.000000000 +0200 +++ xfs/fs/xfs/xfs_inode_item.c 2010-06-19 23:08:14.623253952 +0200 @@ -660,8 +660,10 @@ xfs_inode_item_unlock( lock_flags = iip->ili_lock_flags; iip->ili_lock_flags = 0; - if (lock_flags) - xfs_iput(iip->ili_inode, lock_flags); + if (lock_flags) { + xfs_iunlock(iip->ili_inode, lock_flags); + IRELE(iip->ili_inode); + } } /* Index: xfs/fs/xfs/xfs_itable.c =================================================================== --- xfs.orig/fs/xfs/xfs_itable.c 2010-06-19 23:06:53.000000000 +0200 +++ xfs/fs/xfs/xfs_itable.c 2010-06-19 23:08:14.627253952 +0200 @@ -34,6 +34,7 @@ #include "xfs_itable.h" #include "xfs_error.h" #include "xfs_btree.h" +#include "xfs_trace.h" STATIC int xfs_internal_inum( @@ -139,7 +140,8 @@ xfs_bulkstat_one_int( buf->bs_blocks = dic->di_nblocks + ip->i_delayed_blks; break; } - xfs_iput(ip, XFS_ILOCK_SHARED); + xfs_iunlock(ip, XFS_ILOCK_SHARED); + IRELE(ip); error = formatter(buffer, ubsize, ubused, buf); From BATV+3dae0f5530bf0d1cca01+2493+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 21 03:33: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 o5L8XS1O113454 for ; Mon, 21 Jun 2010 03:33:28 -0500 X-ASG-Debug-ID: 1277109613-62ff02c20000-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 861821454F6C for ; Mon, 21 Jun 2010 01:40:13 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id LHKnTKKvHnVX4Hip for ; Mon, 21 Jun 2010 01:40:13 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OQcUC-0007cV-4m for xfs@oss.sgi.com; Mon, 21 Jun 2010 08:36:08 +0000 Message-Id: <20100621083608.050065100@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 21 Jun 2010 04:35:53 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 10/12] [PATCH] xfs: remove xfs_iput_new Subject: [PATCH 10/12] [PATCH] xfs: remove xfs_iput_new References: <20100621083543.125860679@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-kill-xfs_iput_new 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: 1277109613 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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. In addition to that xfs_nfs_get_inode does not even need to lock the inode given that the generation never changes for a life inode, so just pass a 0 lock_flags to xfs_iget and release the inode using IRELE in the error path. 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-19 23:06:53.086254161 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_export.c 2010-06-19 23:07:10.000000000 +0200 @@ -29,6 +29,7 @@ #include "xfs_bmap_btree.h" #include "xfs_inode.h" #include "xfs_inode_item.h" +#include "xfs_trace.h" /* * Note that we only accept fileids which are long enough rather than allow @@ -131,8 +132,7 @@ xfs_nfs_get_inode( * fine and not an indication of a corrupted filesystem as clients can * send invalid file handles and we have to handle it gracefully.. */ - error = xfs_iget(mp, NULL, ino, XFS_IGET_UNTRUSTED, - XFS_ILOCK_SHARED, &ip); + error = xfs_iget(mp, NULL, ino, XFS_IGET_UNTRUSTED, 0, &ip); if (error) { /* * EINVAL means the inode cluster doesn't exist anymore. @@ -147,11 +147,10 @@ xfs_nfs_get_inode( } if (ip->i_d.di_gen != generation) { - xfs_iput_new(ip, XFS_ILOCK_SHARED); + IRELE(ip); return ERR_PTR(-ENOENT); } - xfs_iunlock(ip, XFS_ILOCK_SHARED); return VFS_I(ip); } Index: xfs/fs/xfs/xfs_iget.c =================================================================== --- xfs.orig/fs/xfs/xfs_iget.c 2010-06-19 23:06:57.008263659 +0200 +++ xfs/fs/xfs/xfs_iget.c 2010-06-21 09:13:49.643254301 +0200 @@ -435,29 +435,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-19 23:06:53.112024311 +0200 +++ xfs/fs/xfs/xfs_inode.h 2010-06-21 09:13:49.669254301 +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 **); 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+3dae0f5530bf0d1cca01+2493+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 21 03:33: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 o5L8XSMO113448 for ; Mon, 21 Jun 2010 03:33:28 -0500 X-ASG-Debug-ID: 1277109612-62cc02ea0000-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 5A5251453C5D for ; Mon, 21 Jun 2010 01:40:13 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id WwwhQRUJjRLhMpIC for ; Mon, 21 Jun 2010 01:40:13 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OQcUB-0007bz-Vf for xfs@oss.sgi.com; Mon, 21 Jun 2010 08:36:08 +0000 Message-Id: <20100621083607.851430261@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 21 Jun 2010 04:35:52 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 09/12] xfs: some iget tracing cleanups / fixes Subject: [PATCH 09/12] xfs: some iget tracing cleanups / fixes References: <20100621083543.125860679@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-cleanup-iget-tracing 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: 1277109613 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 xfs_iget_alloc/found tracepoints are a bit misnamed and misplaced. Rename them to xfs_iget_hit/xfs_iget_miss and move them to the beggining of the xfs_iget_cache_hit/miss functions. Add a new xfs_iget_reclaim_fail tracepoint for the case where we fail to re-initialize a VFS inode, and add a second instance of the xfs_iget_skip tracepoint for the case of a failed igrab() call. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/linux-2.6/xfs_trace.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_trace.h 2010-06-19 10:42:37.374266953 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_trace.h 2010-06-19 14:37:04.680004137 +0200 @@ -558,8 +558,9 @@ DEFINE_EVENT(xfs_iget_class, name, \ TP_ARGS(ip)) DEFINE_IGET_EVENT(xfs_iget_skip); DEFINE_IGET_EVENT(xfs_iget_reclaim); -DEFINE_IGET_EVENT(xfs_iget_found); -DEFINE_IGET_EVENT(xfs_iget_alloc); +DEFINE_IGET_EVENT(xfs_iget_reclaim_fail); +DEFINE_IGET_EVENT(xfs_iget_hit); +DEFINE_IGET_EVENT(xfs_iget_miss); DECLARE_EVENT_CLASS(xfs_inode_class, TP_PROTO(struct xfs_inode *ip, unsigned long caller_ip), Index: xfs/fs/xfs/xfs_iget.c =================================================================== --- xfs.orig/fs/xfs/xfs_iget.c 2010-06-19 10:44:00.955254311 +0200 +++ xfs/fs/xfs/xfs_iget.c 2010-06-19 10:54:39.000000000 +0200 @@ -208,7 +208,7 @@ xfs_iget_cache_hit( ip->i_flags &= ~XFS_INEW; ip->i_flags |= XFS_IRECLAIMABLE; __xfs_inode_set_reclaim_tag(pag, ip); - trace_xfs_iget_reclaim(ip); + trace_xfs_iget_reclaim_fail(ip); goto out_error; } @@ -223,6 +223,7 @@ xfs_iget_cache_hit( } else { /* If the VFS inode is being torn down, pause and try again. */ if (!igrab(inode)) { + trace_xfs_iget_skip(ip); error = EAGAIN; goto out_error; } @@ -230,6 +231,7 @@ xfs_iget_cache_hit( /* We've got a live one. */ spin_unlock(&ip->i_flags_lock); read_unlock(&pag->pag_ici_lock); + trace_xfs_iget_hit(ip); } if (lock_flags != 0) @@ -238,7 +240,6 @@ xfs_iget_cache_hit( xfs_iflags_clear(ip, XFS_ISTALE); XFS_STATS_INC(xs_ig_found); - trace_xfs_iget_found(ip); return 0; out_error: @@ -271,7 +272,7 @@ xfs_iget_cache_miss( if (error) goto out_destroy; - xfs_itrace_entry(ip); + trace_xfs_iget_miss(ip); if ((ip->i_d.di_mode == 0) && !(flags & XFS_IGET_CREATE)) { error = ENOENT; @@ -317,7 +318,6 @@ xfs_iget_cache_miss( write_unlock(&pag->pag_ici_lock); radix_tree_preload_end(); - trace_xfs_iget_alloc(ip); *ipp = ip; return 0; From BATV+3dae0f5530bf0d1cca01+2493+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 21 03:33: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=unavailable 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 o5L8XSDB113446 for ; Mon, 21 Jun 2010 03:33:28 -0500 X-ASG-Debug-ID: 1277109612-62dc03010000-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 3696514515CB for ; Mon, 21 Jun 2010 01:40:12 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id d3oTnCHCSDde2UmD for ; Mon, 21 Jun 2010 01:40:12 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OQcUB-0007bH-P7 for xfs@oss.sgi.com; Mon, 21 Jun 2010 08:36:07 +0000 Message-Id: <20100621083607.672484712@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 21 Jun 2010 04:35:51 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 08/12] xfs: do not use emums for flags used in tracing Subject: [PATCH 08/12] xfs: do not use emums for flags used in tracing References: <20100621083543.125860679@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-tracing-doesnt-like-enums 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: 1277109613 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 tracing code can't print flags defined as enums. Most flags that we want to print are defines as macros already, but move the few remaining ones over to make the trace output more useful. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_alloc.h =================================================================== --- xfs.orig/fs/xfs/xfs_alloc.h 2010-06-16 14:32:30.000000000 +0200 +++ xfs/fs/xfs/xfs_alloc.h 2010-06-16 14:41:06.701005358 +0200 @@ -27,16 +27,16 @@ struct xfs_busy_extent; /* * Freespace allocation types. Argument to xfs_alloc_[v]extent. */ -typedef enum xfs_alloctype -{ - XFS_ALLOCTYPE_ANY_AG, /* allocate anywhere, use rotor */ - XFS_ALLOCTYPE_FIRST_AG, /* ... start at ag 0 */ - XFS_ALLOCTYPE_START_AG, /* anywhere, start in this a.g. */ - XFS_ALLOCTYPE_THIS_AG, /* anywhere in this a.g. */ - XFS_ALLOCTYPE_START_BNO, /* near this block else anywhere */ - XFS_ALLOCTYPE_NEAR_BNO, /* in this a.g. and near this block */ - XFS_ALLOCTYPE_THIS_BNO /* at exactly this block */ -} xfs_alloctype_t; +#define XFS_ALLOCTYPE_ANY_AG 0x01 /* allocate anywhere, use rotor */ +#define XFS_ALLOCTYPE_FIRST_AG 0x02 /* ... start at ag 0 */ +#define XFS_ALLOCTYPE_START_AG 0x04 /* anywhere, start in this a.g. */ +#define XFS_ALLOCTYPE_THIS_AG 0x08 /* anywhere in this a.g. */ +#define XFS_ALLOCTYPE_START_BNO 0x10 /* near this block else anywhere */ +#define XFS_ALLOCTYPE_NEAR_BNO 0x20 /* in this a.g. and near this block */ +#define XFS_ALLOCTYPE_THIS_BNO 0x40 /* at exactly this block */ + +/* this should become an enum again when the tracing code is fixed */ +typedef unsigned int xfs_alloctype_t; #define XFS_ALLOC_TYPES \ { XFS_ALLOCTYPE_ANY_AG, "ANY_AG" }, \ Index: xfs/fs/xfs/xfs_iomap.h =================================================================== --- xfs.orig/fs/xfs/xfs_iomap.h 2010-06-16 14:33:09.000000000 +0200 +++ xfs/fs/xfs/xfs_iomap.h 2010-06-16 14:39:50.906009896 +0200 @@ -18,16 +18,16 @@ #ifndef __XFS_IOMAP_H__ #define __XFS_IOMAP_H__ -typedef enum { - /* base extent manipulation calls */ - BMAPI_READ = (1 << 0), /* read extents */ - BMAPI_WRITE = (1 << 1), /* create extents */ - BMAPI_ALLOCATE = (1 << 2), /* delayed allocate to real extents */ - /* modifiers */ - BMAPI_IGNSTATE = (1 << 4), /* ignore unwritten state on read */ - BMAPI_DIRECT = (1 << 5), /* direct instead of buffered write */ - BMAPI_TRYLOCK = (1 << 7), /* non-blocking request */ -} bmapi_flags_t; +/* base extent manipulation calls */ +#define BMAPI_READ (1 << 0) /* read extents */ +#define BMAPI_WRITE (1 << 1) /* create extents */ +#define BMAPI_ALLOCATE (1 << 2) /* delayed allocate to real extents */ + +/* modifiers */ +#define BMAPI_IGNSTATE (1 << 4) /* ignore unwritten state on read */ +#define BMAPI_DIRECT (1 << 5) /* direct instead of buffered write */ +#define BMAPI_MMA (1 << 6) /* allocate for mmap write */ +#define BMAPI_TRYLOCK (1 << 7) /* non-blocking request */ #define BMAPI_FLAGS \ { BMAPI_READ, "READ" }, \ Index: xfs/fs/xfs/linux-2.6/xfs_buf.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_buf.h 2010-06-16 14:41:35.278003751 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_buf.h 2010-06-18 09:57:22.366004277 +0200 @@ -44,57 +44,57 @@ typedef enum { XBRW_ZERO = 3, /* Zero target memory */ } xfs_buf_rw_t; -typedef enum { - XBF_READ = (1 << 0), /* buffer intended for reading from device */ - XBF_WRITE = (1 << 1), /* buffer intended for writing to device */ - XBF_MAPPED = (1 << 2), /* buffer mapped (b_addr valid) */ - XBF_ASYNC = (1 << 4), /* initiator will not wait for completion */ - XBF_DONE = (1 << 5), /* all pages in the buffer uptodate */ - XBF_DELWRI = (1 << 6), /* buffer has dirty pages */ - XBF_STALE = (1 << 7), /* buffer has been staled, do not find it */ - XBF_FS_MANAGED = (1 << 8), /* filesystem controls freeing memory */ - XBF_ORDERED = (1 << 11), /* use ordered writes */ - XBF_READ_AHEAD = (1 << 12), /* asynchronous read-ahead */ - XBF_LOG_BUFFER = (1 << 13), /* this is a buffer used for the log */ - - /* flags used only as arguments to access routines */ - XBF_LOCK = (1 << 14), /* lock requested */ - XBF_TRYLOCK = (1 << 15), /* lock requested, but do not wait */ - XBF_DONT_BLOCK = (1 << 16), /* do not block in current thread */ - - /* flags used only internally */ - _XBF_PAGE_CACHE = (1 << 17),/* backed by pagecache */ - _XBF_PAGES = (1 << 18), /* backed by refcounted pages */ - _XBF_RUN_QUEUES = (1 << 19),/* run block device task queue */ - _XBF_DELWRI_Q = (1 << 21), /* buffer on delwri queue */ - - /* - * Special flag for supporting metadata blocks smaller than a FSB. - * - * In this case we can have multiple xfs_buf_t on a single page and - * need to lock out concurrent xfs_buf_t readers as they only - * serialise access to the buffer. - * - * If the FSB size >= PAGE_CACHE_SIZE case, we have no serialisation - * between reads of the page. Hence we can have one thread read the - * page and modify it, but then race with another thread that thinks - * the page is not up-to-date and hence reads it again. - * - * The result is that the first modifcation to the page is lost. - * This sort of AGF/AGI reading race can happen when unlinking inodes - * that require truncation and results in the AGI unlinked list - * modifications being lost. - */ - _XBF_PAGE_LOCKED = (1 << 22), - - /* - * If we try a barrier write, but it fails we have to communicate - * this to the upper layers. Unfortunately b_error gets overwritten - * when the buffer is re-issued so we have to add another flag to - * keep this information. - */ - _XFS_BARRIER_FAILED = (1 << 23), -} xfs_buf_flags_t; +#define XBF_READ (1 << 0) /* buffer intended for reading from device */ +#define XBF_WRITE (1 << 1) /* buffer intended for writing to device */ +#define XBF_MAPPED (1 << 2) /* buffer mapped (b_addr valid) */ +#define XBF_ASYNC (1 << 4) /* initiator will not wait for completion */ +#define XBF_DONE (1 << 5) /* all pages in the buffer uptodate */ +#define XBF_DELWRI (1 << 6) /* buffer has dirty pages */ +#define XBF_STALE (1 << 7) /* buffer has been staled, do not find it */ +#define XBF_FS_MANAGED (1 << 8) /* filesystem controls freeing memory */ +#define XBF_ORDERED (1 << 11)/* use ordered writes */ +#define XBF_READ_AHEAD (1 << 12)/* asynchronous read-ahead */ +#define XBF_LOG_BUFFER (1 << 13)/* this is a buffer used for the log */ + +/* flags used only as arguments to access routines */ +#define XBF_LOCK (1 << 14)/* lock requested */ +#define XBF_TRYLOCK (1 << 15)/* lock requested, but do not wait */ +#define XBF_DONT_BLOCK (1 << 16)/* do not block in current thread */ + +/* flags used only internally */ +#define _XBF_PAGE_CACHE (1 << 17)/* backed by pagecache */ +#define _XBF_PAGES (1 << 18)/* backed by refcounted pages */ +#define _XBF_RUN_QUEUES (1 << 19)/* run block device task queue */ +#define _XBF_DELWRI_Q (1 << 21)/* buffer on delwri queue */ + +/* + * Special flag for supporting metadata blocks smaller than a FSB. + * + * In this case we can have multiple xfs_buf_t on a single page and + * need to lock out concurrent xfs_buf_t readers as they only + * serialise access to the buffer. + * + * If the FSB size >= PAGE_CACHE_SIZE case, we have no serialisation + * between reads of the page. Hence we can have one thread read the + * page and modify it, but then race with another thread that thinks + * the page is not up-to-date and hence reads it again. + * + * The result is that the first modifcation to the page is lost. + * This sort of AGF/AGI reading race can happen when unlinking inodes + * that require truncation and results in the AGI unlinked list + * modifications being lost. + */ +#define _XBF_PAGE_LOCKED (1 << 22) + +/* + * If we try a barrier write, but it fails we have to communicate + * this to the upper layers. Unfortunately b_error gets overwritten + * when the buffer is re-issued so we have to add another flag to + * keep this information. + */ +#define _XFS_BARRIER_FAILED (1 << 23) + +typedef unsigned int xfs_buf_flags_t; #define XFS_BUF_FLAGS \ { XBF_READ, "READ" }, \ From BATV+3dae0f5530bf0d1cca01+2493+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 21 03:33: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 o5L8XRxH113443 for ; Mon, 21 Jun 2010 03:33:28 -0500 X-ASG-Debug-ID: 1277109612-630002ef0000-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 9696014515CB for ; Mon, 21 Jun 2010 01:40:12 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id iCaBKMncE5uFZlpq for ; Mon, 21 Jun 2010 01:40:12 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OQcUB-0007ZC-2N for xfs@oss.sgi.com; Mon, 21 Jun 2010 08:36:07 +0000 Message-Id: <20100621083606.962351649@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 21 Jun 2010 04:35:47 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 04/12] xfs: simplify xfs_vm_writepage Subject: [PATCH 04/12] xfs: simplify xfs_vm_writepage References: <20100621083543.125860679@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: 1277109612 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 Reviewed-by: Dave Chinner 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+3dae0f5530bf0d1cca01+2493+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 21 03:33: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 (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5L8XR9a113440 for ; Mon, 21 Jun 2010 03:33:28 -0500 X-ASG-Debug-ID: 1277109367-6ba302f50000-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 DEE46267830 for ; Mon, 21 Jun 2010 01:36:07 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id dvQy7KrjjRNjUHBN for ; Mon, 21 Jun 2010 01:36:07 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OQcUB-0007al-JB for xfs@oss.sgi.com; Mon, 21 Jun 2010 08:36:07 +0000 Message-Id: <20100621083607.476361881@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 21 Jun 2010 04:35:50 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 07/12] xfs: remove explicit xfs_sync_data/xfs_sync_attr calls on umount Subject: [PATCH 07/12] xfs: remove explicit xfs_sync_data/xfs_sync_attr calls on umount References: <20100621083543.125860679@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-remove-sync-on-umount 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: 1277109367 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 the final put of a superblock the VFS already calls sync_filesystem for us to write out all data and wait for it. No need to start another asynchronous writenack inside ->put_super. 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-19 11:54:54.072006021 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_super.c 2010-06-19 12:26:48.388003856 +0200 @@ -1160,18 +1160,6 @@ xfs_fs_put_super( xfs_syncd_stop(mp); - if (!(sb->s_flags & MS_RDONLY)) { - /* - * XXX(hch): this should be SYNC_WAIT. - * - * Or more likely not needed at all because the VFS is already - * calling ->sync_fs after shutting down all filestem - * operations and just before calling ->put_super. - */ - xfs_sync_data(mp, 0); - xfs_sync_attr(mp, 0); - } - /* * Blow away any referenced inode in the filestreams cache. * This can and will cause log traffic as inodes go inactive Index: xfs/fs/xfs/linux-2.6/xfs_sync.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c 2010-06-19 10:41:57.626004207 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_sync.c 2010-06-19 12:26:48.389003298 +0200 @@ -274,7 +274,7 @@ xfs_sync_inode_attr( /* * Write out pagecache data for the whole filesystem. */ -int +STATIC int xfs_sync_data( struct xfs_mount *mp, int flags) @@ -295,7 +295,7 @@ xfs_sync_data( /* * Write out inode metadata (attributes) for the whole filesystem. */ -int +STATIC int xfs_sync_attr( struct xfs_mount *mp, int flags) Index: xfs/fs/xfs/linux-2.6/xfs_sync.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.h 2010-06-19 10:41:57.647253683 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_sync.h 2010-06-19 12:26:48.391003717 +0200 @@ -35,9 +35,6 @@ typedef struct xfs_sync_work { int xfs_syncd_init(struct xfs_mount *mp); void xfs_syncd_stop(struct xfs_mount *mp); -int xfs_sync_attr(struct xfs_mount *mp, int flags); -int xfs_sync_data(struct xfs_mount *mp, int flags); - int xfs_quiesce_data(struct xfs_mount *mp); void xfs_quiesce_attr(struct xfs_mount *mp); From BATV+3dae0f5530bf0d1cca01+2493+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 21 03:33:29 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5L8XQ3c113430 for ; Mon, 21 Jun 2010 03:33:29 -0500 X-ASG-Debug-ID: 1277109366-77df02210000-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 CC5A7267830 for ; Mon, 21 Jun 2010 01:36:06 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id idZcUunGjq3EI5EB for ; Mon, 21 Jun 2010 01:36:06 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OQcUA-0007Xd-G0 for xfs@oss.sgi.com; Mon, 21 Jun 2010 08:36:06 +0000 Message-Id: <20100621083606.399435078@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 21 Jun 2010 04:35:44 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 01/12] [PATCH] xfs: avoid synchronous transaction in xfs_fs_write_inode Subject: [PATCH 01/12] [PATCH] xfs: avoid synchronous transaction in xfs_fs_write_inode References: <20100621083543.125860679@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-optimize-write_inode 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: 1277109366 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 In addition to that also remove the delwri inode flush that is unessecary now that bulkstat is always coherent. 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-21 09:31:43.638254092 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_super.c 2010-06-21 09:37:01.982255907 +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); @@ -1048,20 +1047,11 @@ xfs_fs_write_inode( if (wbc->sync_mode == WB_SYNC_ALL) { /* - * Make sure the inode has hit stable storage. By using the - * log and the fsync transactions we reduce the IOs we have - * to do here from two (log and inode) to just the log. - * - * Note: We still need to do a delwri write of the inode after - * this to flush it to the backing buffer so that bulkstat - * works properly if this is the first time the inode has been - * written. Because we hold the ilock atomically over the - * transaction commit and the inode flush we are guaranteed - * that the inode is not pinned when it returns. If the flush - * lock is already held, then the inode has already been - * flushed once and we don't need to flush it again. Hence - * the code will only flush the inode if it isn't already - * being flushed. + * Make sure the inode has made it it into the log. Instead + * of forcing it all the way to stable storage using a + * synchronous transaction we let the log force inside the + * ->sync_fs call do that for thus, which reduces the number + * of synchronous log foces dramatically. */ xfs_ioend_wait(ip); xfs_ilock(ip, XFS_ILOCK_SHARED); @@ -1075,27 +1065,29 @@ xfs_fs_write_inode( * We make this non-blocking if the inode is contended, return * EAGAIN to indicate to the caller that they did not succeed. * This prevents the flush path from blocking on inodes inside - * another operation right now, they get caught later by xfs_sync. + * another operation right now, they get caught later by + * xfs_sync. */ if (!xfs_ilock_nowait(ip, XFS_ILOCK_SHARED)) goto out; - } - if (xfs_ipincount(ip) || !xfs_iflock_nowait(ip)) - goto out_unlock; + if (xfs_ipincount(ip) || !xfs_iflock_nowait(ip)) + goto out_unlock; - /* - * Now we have the flush lock and the inode is not pinned, we can check - * if the inode is really clean as we know that there are no pending - * transaction completions, it is not waiting on the delayed write - * queue and there is no IO in progress. - */ - if (xfs_inode_clean(ip)) { - xfs_ifunlock(ip); - error = 0; - goto out_unlock; + /* + * Now we have the flush lock and the inode is not pinned, we + * can check if the inode is really clean as we know that + * there are no pending transaction completions, it is not + * waiting on the delayed write queue and there is no IO in + * progress. + */ + if (xfs_inode_clean(ip)) { + xfs_ifunlock(ip); + error = 0; + goto out_unlock; + } + error = xfs_iflush(ip, 0); } - error = xfs_iflush(ip, 0); out_unlock: xfs_iunlock(ip, XFS_ILOCK_SHARED); From BATV+3dae0f5530bf0d1cca01+2493+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 21 03:33:29 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5L8XQ93113432 for ; Mon, 21 Jun 2010 03:33:28 -0500 X-ASG-Debug-ID: 1277109366-132b023a0000-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 0A00415113F9 for ; Mon, 21 Jun 2010 01:36:06 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id CvoE7trFdXshoR8f for ; Mon, 21 Jun 2010 01:36:06 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OQcUA-0007X1-As for xfs@oss.sgi.com; Mon, 21 Jun 2010 08:36:06 +0000 Message-Id: <20100621083543.125860679@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 21 Jun 2010 04:35:43 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 00/12] various updates for 2.6.36 Subject: [PATCH 00/12] various updates for 2.6.36 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: 1277109367 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is my current set of pending patches, with the writeback code updates, various tracing updates, the write_inode speedup and a couple of cleanups. Some of the patches have already been sent out individually, but this replaces everything since may last big series on May 31st. It requires that patchset ("[PATCH 00/17] pending patches") to be fully applied and Dave's "[PATCH 0/4, V2] xfs: validate inode numbers in file handles correctly" from today to apply. From BATV+3dae0f5530bf0d1cca01+2493+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 21 03:33: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 (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5L8XRLB113437 for ; Mon, 21 Jun 2010 03:33:29 -0500 X-ASG-Debug-ID: 1277109367-780401fa0000-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 9491A267830 for ; Mon, 21 Jun 2010 01:36:07 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 8loPYz0AVVFyE1ft for ; Mon, 21 Jun 2010 01:36:07 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OQcUB-0007Zi-7y for xfs@oss.sgi.com; Mon, 21 Jun 2010 08:36:07 +0000 Message-Id: <20100621083607.163131230@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 21 Jun 2010 04:35:48 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 05/12] xfs: reduce stack usage in xfs_iomap Subject: [PATCH 05/12] xfs: reduce stack usage in xfs_iomap References: <20100621083543.125860679@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-iomap-more-stack-reduction 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: 1277109367 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean xfs_iomap passes a xfs_bmbt_irec pointer to xfs_iomap_write_direct and xfs_iomap_write_allocate to give them the results of our read-only xfs_bmapi query. Instead of allocating a new xfs_bmbt_irec on stack for the next call to xfs_bmapi re use the one we got passed as it's not used after this point. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_iomap.c =================================================================== --- xfs.orig/fs/xfs/xfs_iomap.c 2010-06-18 09:58:41.210004416 +0200 +++ xfs/fs/xfs/xfs_iomap.c 2010-06-19 14:38:03.535254031 +0200 @@ -242,7 +242,7 @@ xfs_iomap_write_direct( xfs_off_t offset, size_t count, int flags, - xfs_bmbt_irec_t *ret_imap, + xfs_bmbt_irec_t *imap, int *nmaps) { xfs_mount_t *mp = ip->i_mount; @@ -256,7 +256,6 @@ xfs_iomap_write_direct( int quota_flag; int rt; xfs_trans_t *tp; - xfs_bmbt_irec_t imap; xfs_bmap_free_t free_list; uint qblocks, resblks, resrtextents; int committed; @@ -280,10 +279,10 @@ xfs_iomap_write_direct( if (error) goto error_out; } else { - if (*nmaps && (ret_imap->br_startblock == HOLESTARTBLOCK)) + if (*nmaps && (imap->br_startblock == HOLESTARTBLOCK)) last_fsb = MIN(last_fsb, (xfs_fileoff_t) - ret_imap->br_blockcount + - ret_imap->br_startoff); + imap->br_blockcount + + imap->br_startoff); } count_fsb = last_fsb - offset_fsb; ASSERT(count_fsb > 0); @@ -336,12 +335,15 @@ xfs_iomap_write_direct( bmapi_flag |= XFS_BMAPI_PREALLOC; /* - * Issue the xfs_bmapi() call to allocate the blocks + * Issue the xfs_bmapi() call to allocate the blocks. + * + * From this point onwards we overwrite the imap pointer that the + * caller gave to us. */ xfs_bmap_init(&free_list, &firstfsb); nimaps = 1; error = xfs_bmapi(tp, ip, offset_fsb, count_fsb, bmapi_flag, - &firstfsb, 0, &imap, &nimaps, &free_list); + &firstfsb, 0, imap, &nimaps, &free_list); if (error) goto error0; @@ -363,12 +365,11 @@ xfs_iomap_write_direct( goto error_out; } - if (!(imap.br_startblock || XFS_IS_REALTIME_INODE(ip))) { - error = xfs_cmn_err_fsblock_zero(ip, &imap); + if (!(imap->br_startblock || XFS_IS_REALTIME_INODE(ip))) { + error = xfs_cmn_err_fsblock_zero(ip, imap); goto error_out; } - *ret_imap = imap; *nmaps = 1; return 0; @@ -542,7 +543,7 @@ xfs_iomap_write_allocate( xfs_inode_t *ip, xfs_off_t offset, size_t count, - xfs_bmbt_irec_t *map, + xfs_bmbt_irec_t *imap, int *retmap) { xfs_mount_t *mp = ip->i_mount; @@ -551,7 +552,6 @@ xfs_iomap_write_allocate( xfs_fsblock_t first_block; xfs_bmap_free_t free_list; xfs_filblks_t count_fsb; - xfs_bmbt_irec_t imap; xfs_trans_t *tp; int nimaps, committed; int error = 0; @@ -567,8 +567,8 @@ xfs_iomap_write_allocate( return XFS_ERROR(error); offset_fsb = XFS_B_TO_FSBT(mp, offset); - count_fsb = map->br_blockcount; - map_start_fsb = map->br_startoff; + count_fsb = imap->br_blockcount; + map_start_fsb = imap->br_startoff; XFS_STATS_ADD(xs_xstrat_bytes, XFS_FSB_TO_B(mp, count_fsb)); @@ -647,10 +647,15 @@ xfs_iomap_write_allocate( } } - /* Go get the actual blocks */ + /* + * Go get the actual blocks. + * + * From this point onwards we overwrite the imap + * pointer that the caller gave to us. + */ error = xfs_bmapi(tp, ip, map_start_fsb, count_fsb, XFS_BMAPI_WRITE, &first_block, 1, - &imap, &nimaps, &free_list); + imap, &nimaps, &free_list); if (error) goto trans_cancel; @@ -669,13 +674,12 @@ xfs_iomap_write_allocate( * See if we were able to allocate an extent that * covers at least part of the callers request */ - if (!(imap.br_startblock || XFS_IS_REALTIME_INODE(ip))) - return xfs_cmn_err_fsblock_zero(ip, &imap); + if (!(imap->br_startblock || XFS_IS_REALTIME_INODE(ip))) + return xfs_cmn_err_fsblock_zero(ip, imap); - if ((offset_fsb >= imap.br_startoff) && - (offset_fsb < (imap.br_startoff + - imap.br_blockcount))) { - *map = imap; + if ((offset_fsb >= imap->br_startoff) && + (offset_fsb < (imap->br_startoff + + imap->br_blockcount))) { *retmap = 1; XFS_STATS_INC(xs_xstrat_quick); return 0; @@ -685,8 +689,8 @@ xfs_iomap_write_allocate( * So far we have not mapped the requested part of the * file, just surrounding data, try again. */ - count_fsb -= imap.br_blockcount; - map_start_fsb = imap.br_startoff + imap.br_blockcount; + count_fsb -= imap->br_blockcount; + map_start_fsb = imap->br_startoff + imap->br_blockcount; } trans_cancel: From BATV+3dae0f5530bf0d1cca01+2493+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 21 03:33: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=-4.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_12, 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 o5L8XSc0113458 for ; Mon, 21 Jun 2010 03:33:29 -0500 X-ASG-Debug-ID: 1277109613-62ce02e30000-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 01F7B1454F6C for ; Mon, 21 Jun 2010 01:40:13 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 7YfI0urB2Er9srbF for ; Mon, 21 Jun 2010 01:40:13 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OQcUC-0007dj-HD for xfs@oss.sgi.com; Mon, 21 Jun 2010 08:36:08 +0000 Message-Id: <20100621083608.395665984@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 21 Jun 2010 04:35:55 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 12/12] xfs: split xfs_itrace_entry Subject: [PATCH 12/12] xfs: split xfs_itrace_entry References: <20100621083543.125860679@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-split-itrace 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: 1277109614 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Replace the xfs_itrace_entry catchall with specific trace points. For most simple callers we now use the simple inode class, which used to be the iget class, but add more details tracing for namespace events, which now includes the name of the directory entries manipulated. Remove the xfs_inactive trace point, which is a duplicate of the clear_inode one, and the xfs_change_file_space trace point, which is immediately followed by the more specific alloc/free space trace points. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/linux-2.6/xfs_acl.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_acl.c 2010-06-21 09:31:42.750254231 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_acl.c 2010-06-21 09:38:38.800255768 +0200 @@ -225,7 +225,7 @@ xfs_check_acl(struct inode *inode, int m struct posix_acl *acl; int error = -EAGAIN; - xfs_itrace_entry(ip); + trace_xfs_check_acl(ip); /* * If there is no attribute fork no ACL exists on this inode and Index: xfs/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-06-21 09:38:38.667254022 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-06-21 09:38:38.802285241 +0200 @@ -1513,7 +1513,7 @@ xfs_vm_bmap( struct inode *inode = (struct inode *)mapping->host; struct xfs_inode *ip = XFS_I(inode); - xfs_itrace_entry(XFS_I(inode)); + trace_xfs_vm_bmap(XFS_I(inode)); xfs_ilock(ip, XFS_IOLOCK_SHARED); xfs_flush_pages(ip, (xfs_off_t)0, -1, 0, FI_REMAPF); xfs_iunlock(ip, XFS_IOLOCK_SHARED); Index: xfs/fs/xfs/linux-2.6/xfs_file.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_file.c 2010-06-21 09:31:42.765253742 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_file.c 2010-06-21 09:38:38.807317438 +0200 @@ -100,7 +100,7 @@ xfs_file_fsync( int error = 0; int log_flushed = 0; - xfs_itrace_entry(ip); + trace_xfs_file_fsync(ip); if (XFS_FORCED_SHUTDOWN(ip->i_mount)) return -XFS_ERROR(EIO); Index: xfs/fs/xfs/linux-2.6/xfs_ioctl.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl.c 2010-06-21 09:31:42.775254720 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_ioctl.c 2010-06-21 09:38:38.810292505 +0200 @@ -899,7 +899,7 @@ xfs_ioctl_setattr( struct xfs_dquot *olddquot = NULL; int code; - xfs_itrace_entry(ip); + trace_xfs_ioctl_setattr(ip); if (mp->m_flags & XFS_MOUNT_RDONLY) return XFS_ERROR(EROFS); @@ -1282,7 +1282,7 @@ xfs_file_ioctl( if (filp->f_mode & FMODE_NOCMTIME) ioflags |= IO_INVIS; - xfs_itrace_entry(ip); + trace_xfs_file_ioctl(ip); switch (cmd) { case XFS_IOC_ALLOCSP: Index: xfs/fs/xfs/linux-2.6/xfs_ioctl32.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl32.c 2010-06-21 09:31:47.810003149 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_ioctl32.c 2010-06-21 09:38:38.815255279 +0200 @@ -540,7 +540,7 @@ xfs_file_compat_ioctl( if (filp->f_mode & FMODE_NOCMTIME) ioflags |= IO_INVIS; - xfs_itrace_entry(ip); + trace_xfs_file_compat_ioctl(ip); switch (cmd) { /* No size or alignment issues on any arch */ Index: xfs/fs/xfs/linux-2.6/xfs_iops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_iops.c 2010-06-21 09:31:42.790254790 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_iops.c 2010-06-21 09:38:38.820255558 +0200 @@ -488,7 +488,7 @@ xfs_vn_getattr( struct xfs_inode *ip = XFS_I(inode); struct xfs_mount *mp = ip->i_mount; - xfs_itrace_entry(ip); + trace_xfs_getattr(ip); if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); Index: xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2010-06-21 09:38:38.683275324 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_super.c 2010-06-21 09:38:38.827255768 +0200 @@ -907,7 +907,7 @@ xfs_fs_destroy_inode( { struct xfs_inode *ip = XFS_I(inode); - xfs_itrace_entry(ip); + trace_xfs_destroy_inode(ip); XFS_STATS_INC(vn_reclaim); @@ -1040,7 +1040,7 @@ xfs_fs_write_inode( struct xfs_mount *mp = ip->i_mount; int error = EAGAIN; - xfs_itrace_entry(ip); + trace_xfs_write_inode(ip); if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); @@ -1107,7 +1107,8 @@ xfs_fs_clear_inode( { xfs_inode_t *ip = XFS_I(inode); - xfs_itrace_entry(ip); + trace_xfs_clear_inode(ip); + XFS_STATS_INC(vn_rele); XFS_STATS_INC(vn_remove); XFS_STATS_DEC(vn_active); Index: xfs/fs/xfs/linux-2.6/xfs_trace.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_trace.h 2010-06-21 09:38:38.711253323 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_trace.h 2010-06-21 09:38:38.834282797 +0200 @@ -536,7 +536,7 @@ DEFINE_LOCK_EVENT(xfs_ilock_nowait); DEFINE_LOCK_EVENT(xfs_ilock_demote); DEFINE_LOCK_EVENT(xfs_iunlock); -DECLARE_EVENT_CLASS(xfs_iget_class, +DECLARE_EVENT_CLASS(xfs_inode_class, TP_PROTO(struct xfs_inode *ip), TP_ARGS(ip), TP_STRUCT__entry( @@ -552,17 +552,36 @@ DECLARE_EVENT_CLASS(xfs_iget_class, __entry->ino) ) -#define DEFINE_IGET_EVENT(name) \ -DEFINE_EVENT(xfs_iget_class, name, \ +#define DEFINE_INODE_EVENT(name) \ +DEFINE_EVENT(xfs_inode_class, name, \ TP_PROTO(struct xfs_inode *ip), \ TP_ARGS(ip)) -DEFINE_IGET_EVENT(xfs_iget_skip); -DEFINE_IGET_EVENT(xfs_iget_reclaim); -DEFINE_IGET_EVENT(xfs_iget_reclaim_fail); -DEFINE_IGET_EVENT(xfs_iget_hit); -DEFINE_IGET_EVENT(xfs_iget_miss); +DEFINE_INODE_EVENT(xfs_iget_skip); +DEFINE_INODE_EVENT(xfs_iget_reclaim); +DEFINE_INODE_EVENT(xfs_iget_reclaim_fail); +DEFINE_INODE_EVENT(xfs_iget_hit); +DEFINE_INODE_EVENT(xfs_iget_miss); + +DEFINE_INODE_EVENT(xfs_getattr); +DEFINE_INODE_EVENT(xfs_setattr); +DEFINE_INODE_EVENT(xfs_readlink); +DEFINE_INODE_EVENT(xfs_alloc_file_space); +DEFINE_INODE_EVENT(xfs_free_file_space); +DEFINE_INODE_EVENT(xfs_readdir); +DEFINE_INODE_EVENT(xfs_check_acl); +DEFINE_INODE_EVENT(xfs_vm_bmap); +DEFINE_INODE_EVENT(xfs_file_ioctl); +DEFINE_INODE_EVENT(xfs_file_compat_ioctl); +DEFINE_INODE_EVENT(xfs_ioctl_setattr); +DEFINE_INODE_EVENT(xfs_file_fsync); +DEFINE_INODE_EVENT(xfs_destroy_inode); +DEFINE_INODE_EVENT(xfs_write_inode); +DEFINE_INODE_EVENT(xfs_clear_inode); -DECLARE_EVENT_CLASS(xfs_inode_class, +DEFINE_INODE_EVENT(xfs_dquot_dqalloc); +DEFINE_INODE_EVENT(xfs_dquot_dqdetach); + +DECLARE_EVENT_CLASS(xfs_iref_class, TP_PROTO(struct xfs_inode *ip, unsigned long caller_ip), TP_ARGS(ip, caller_ip), TP_STRUCT__entry( @@ -587,20 +606,71 @@ DECLARE_EVENT_CLASS(xfs_inode_class, (char *)__entry->caller_ip) ) -#define DEFINE_INODE_EVENT(name) \ -DEFINE_EVENT(xfs_inode_class, name, \ +#define DEFINE_IREF_EVENT(name) \ +DEFINE_EVENT(xfs_iref_class, name, \ TP_PROTO(struct xfs_inode *ip, unsigned long caller_ip), \ TP_ARGS(ip, caller_ip)) -DEFINE_INODE_EVENT(xfs_ihold); -DEFINE_INODE_EVENT(xfs_irele); -DEFINE_INODE_EVENT(xfs_inode_pin); -DEFINE_INODE_EVENT(xfs_inode_unpin); -DEFINE_INODE_EVENT(xfs_inode_unpin_nowait); - -/* the old xfs_itrace_entry tracer - to be replaced by s.th. in the VFS */ -DEFINE_INODE_EVENT(xfs_inode); -#define xfs_itrace_entry(ip) \ - trace_xfs_inode(ip, _THIS_IP_) +DEFINE_IREF_EVENT(xfs_ihold); +DEFINE_IREF_EVENT(xfs_irele); +DEFINE_IREF_EVENT(xfs_inode_pin); +DEFINE_IREF_EVENT(xfs_inode_unpin); +DEFINE_IREF_EVENT(xfs_inode_unpin_nowait); + +DECLARE_EVENT_CLASS(xfs_namespace_class, + TP_PROTO(struct xfs_inode *dp, struct xfs_name *name), + TP_ARGS(dp, name), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, dp_ino) + __dynamic_array(char, name, name->len) + ), + TP_fast_assign( + __entry->dev = VFS_I(dp)->i_sb->s_dev; + __entry->dp_ino = dp->i_ino; + memcpy(__get_str(name), name->name, name->len); + ), + TP_printk("dev %d:%d dp ino 0x%llx name %s", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->dp_ino, + __get_str(name)) +) + +#define DEFINE_NAMESPACE_EVENT(name) \ +DEFINE_EVENT(xfs_namespace_class, name, \ + TP_PROTO(struct xfs_inode *dp, struct xfs_name *name), \ + TP_ARGS(dp, name)) +DEFINE_NAMESPACE_EVENT(xfs_remove); +DEFINE_NAMESPACE_EVENT(xfs_link); +DEFINE_NAMESPACE_EVENT(xfs_lookup); +DEFINE_NAMESPACE_EVENT(xfs_create); +DEFINE_NAMESPACE_EVENT(xfs_symlink); + +TRACE_EVENT(xfs_rename, + TP_PROTO(struct xfs_inode *src_dp, struct xfs_inode *target_dp, + struct xfs_name *src_name, struct xfs_name *target_name), + TP_ARGS(src_dp, target_dp, src_name, target_name), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, src_dp_ino) + __field(xfs_ino_t, target_dp_ino) + __dynamic_array(char, src_name, src_name->len) + __dynamic_array(char, target_name, target_name->len) + ), + TP_fast_assign( + __entry->dev = VFS_I(src_dp)->i_sb->s_dev; + __entry->src_dp_ino = src_dp->i_ino; + __entry->target_dp_ino = target_dp->i_ino; + memcpy(__get_str(src_name), src_name->name, src_name->len); + memcpy(__get_str(target_name), target_name->name, target_name->len); + ), + TP_printk("dev %d:%d src dp ino 0x%llx target dp ino 0x%llx" + " src name %s target name %s", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->src_dp_ino, + __entry->target_dp_ino, + __get_str(src_name), + __get_str(target_name)) +) DECLARE_EVENT_CLASS(xfs_dquot_class, TP_PROTO(struct xfs_dquot *dqp), @@ -680,9 +750,6 @@ DEFINE_DQUOT_EVENT(xfs_dqrele); DEFINE_DQUOT_EVENT(xfs_dqflush); DEFINE_DQUOT_EVENT(xfs_dqflush_force); DEFINE_DQUOT_EVENT(xfs_dqflush_done); -/* not really iget events, but we re-use the format */ -DEFINE_IGET_EVENT(xfs_dquot_dqalloc); -DEFINE_IGET_EVENT(xfs_dquot_dqdetach); DECLARE_EVENT_CLASS(xfs_loggrant_class, TP_PROTO(struct log *log, struct xlog_ticket *tic), Index: xfs/fs/xfs/xfs_dir2.c =================================================================== --- xfs.orig/fs/xfs/xfs_dir2.c 2010-06-21 09:31:42.811254930 +0200 +++ xfs/fs/xfs/xfs_dir2.c 2010-06-21 09:38:38.840032692 +0200 @@ -380,7 +380,7 @@ xfs_readdir( int rval; /* return value */ int v; /* type-checking value */ - xfs_itrace_entry(dp); + trace_xfs_readdir(dp); if (XFS_FORCED_SHUTDOWN(dp->i_mount)) return XFS_ERROR(EIO); Index: xfs/fs/xfs/xfs_vnodeops.c =================================================================== --- xfs.orig/fs/xfs/xfs_vnodeops.c 2010-06-21 09:31:47.890255838 +0200 +++ xfs/fs/xfs/xfs_vnodeops.c 2010-06-21 09:38:38.848255488 +0200 @@ -68,7 +68,7 @@ xfs_setattr( struct xfs_dquot *udqp, *gdqp, *olddquot1, *olddquot2; int need_iolock = 1; - xfs_itrace_entry(ip); + trace_xfs_setattr(ip); if (mp->m_flags & XFS_MOUNT_RDONLY) return XFS_ERROR(EROFS); @@ -533,7 +533,7 @@ xfs_readlink( int pathlen; int error = 0; - xfs_itrace_entry(ip); + trace_xfs_readlink(ip); if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); @@ -1005,8 +1005,6 @@ xfs_inactive( int error; int truncate; - xfs_itrace_entry(ip); - /* * If the inode is already free, then there can be nothing * to clean up here. @@ -1221,7 +1219,7 @@ xfs_lookup( int error; uint lock_mode; - xfs_itrace_entry(dp); + trace_xfs_lookup(dp, name); if (XFS_FORCED_SHUTDOWN(dp->i_mount)) return XFS_ERROR(EIO); @@ -1273,7 +1271,7 @@ xfs_create( uint log_res; uint log_count; - xfs_itrace_entry(dp); + trace_xfs_create(dp, name); if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); @@ -1670,8 +1668,7 @@ xfs_remove( uint resblks; uint log_count; - xfs_itrace_entry(dp); - xfs_itrace_entry(ip); + trace_xfs_remove(dp, name); if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); @@ -1832,8 +1829,7 @@ xfs_link( int committed; int resblks; - xfs_itrace_entry(tdp); - xfs_itrace_entry(sip); + trace_xfs_link(tdp, target_name); ASSERT(!S_ISDIR(sip->i_d.di_mode)); @@ -1966,7 +1962,7 @@ xfs_symlink( ip = NULL; tp = NULL; - xfs_itrace_entry(dp); + trace_xfs_symlink(dp, link_name); if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); @@ -2256,7 +2252,7 @@ xfs_alloc_file_space( int committed; int error; - xfs_itrace_entry(ip); + trace_xfs_alloc_file_space(ip); if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); @@ -2517,7 +2513,7 @@ xfs_free_file_space( mp = ip->i_mount; - xfs_itrace_entry(ip); + trace_xfs_free_file_space(ip); error = xfs_qm_dqattach(ip, 0); if (error) @@ -2707,8 +2703,6 @@ xfs_change_file_space( xfs_trans_t *tp; struct iattr iattr; - xfs_itrace_entry(ip); - if (!S_ISREG(ip->i_d.di_mode)) return XFS_ERROR(EINVAL); Index: xfs/fs/xfs/xfs_rename.c =================================================================== --- xfs.orig/fs/xfs/xfs_rename.c 2010-06-21 09:31:42.833254441 +0200 +++ xfs/fs/xfs/xfs_rename.c 2010-06-21 09:38:38.853285101 +0200 @@ -113,8 +113,7 @@ xfs_rename( int spaceres; int num_inodes; - xfs_itrace_entry(src_dp); - xfs_itrace_entry(target_dp); + trace_xfs_rename(src_dp, target_dp, src_name, target_name); new_parent = (src_dp != target_dp); src_is_directory = ((src_ip->i_d.di_mode & S_IFMT) == S_IFDIR); From BATV+3dae0f5530bf0d1cca01+2493+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 21 03:33:29 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5L8XRX4113439 for ; Mon, 21 Jun 2010 03:33:29 -0500 X-ASG-Debug-ID: 1277109367-137102490000-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 B4AC015113FF for ; Mon, 21 Jun 2010 01:36:07 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id KIreF4515ihYmHCu for ; Mon, 21 Jun 2010 01:36:07 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OQcUB-0007aE-Da for xfs@oss.sgi.com; Mon, 21 Jun 2010 08:36:07 +0000 Message-Id: <20100621083607.340728554@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Mon, 21 Jun 2010 04:35:49 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH 06/12] xfs: small cleanups for xfs_iomap / __xfs_get_blocks Subject: [PATCH 06/12] xfs: small cleanups for xfs_iomap / __xfs_get_blocks References: <20100621083543.125860679@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-iomap-cleanup X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1277109367 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Remove the flags argument to __xfs_get_blocks as we can easily derive it from the direct argument, and remove the unused BMAPI_MMAP flag. 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-19 14:37:17.299004136 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-06-19 14:39:34.313254590 +0200 @@ -1295,9 +1295,9 @@ __xfs_get_blocks( sector_t iblock, struct buffer_head *bh_result, int create, - int direct, - bmapi_flags_t flags) + int direct) { + int flags = create ? BMAPI_WRITE : BMAPI_READ; struct xfs_bmbt_irec imap; xfs_off_t offset; ssize_t size; @@ -1312,8 +1312,11 @@ __xfs_get_blocks( if (!create && direct && offset >= i_size_read(inode)) return 0; - error = xfs_iomap(XFS_I(inode), offset, size, - create ? flags : BMAPI_READ, &imap, &nimap, &new); + if (direct && create) + flags |= BMAPI_DIRECT; + + error = xfs_iomap(XFS_I(inode), offset, size, flags, &imap, &nimap, + &new); if (error) return -error; if (nimap == 0) @@ -1393,8 +1396,7 @@ xfs_get_blocks( struct buffer_head *bh_result, int create) { - return __xfs_get_blocks(inode, iblock, - bh_result, create, 0, BMAPI_WRITE); + return __xfs_get_blocks(inode, iblock, bh_result, create, 0); } STATIC int @@ -1404,8 +1406,7 @@ xfs_get_blocks_direct( struct buffer_head *bh_result, int create) { - return __xfs_get_blocks(inode, iblock, - bh_result, create, 1, BMAPI_WRITE|BMAPI_DIRECT); + return __xfs_get_blocks(inode, iblock, bh_result, create, 1); } STATIC void Index: xfs/fs/xfs/xfs_iomap.c =================================================================== --- xfs.orig/fs/xfs/xfs_iomap.c 2010-06-19 14:38:03.535254031 +0200 +++ xfs/fs/xfs/xfs_iomap.c 2010-06-19 14:39:34.313254590 +0200 @@ -133,7 +133,7 @@ xfs_iomap( break; } - if (flags & (BMAPI_DIRECT|BMAPI_MMAP)) { + if (flags & BMAPI_DIRECT) { error = xfs_iomap_write_direct(ip, offset, count, flags, imap, nimaps); } else { Index: xfs/fs/xfs/xfs_iomap.h =================================================================== --- xfs.orig/fs/xfs/xfs_iomap.h 2010-06-19 14:37:17.318004066 +0200 +++ xfs/fs/xfs/xfs_iomap.h 2010-06-19 14:39:34.318254380 +0200 @@ -26,7 +26,6 @@ typedef enum { /* modifiers */ BMAPI_IGNSTATE = (1 << 4), /* ignore unwritten state on read */ BMAPI_DIRECT = (1 << 5), /* direct instead of buffered write */ - BMAPI_MMAP = (1 << 6), /* allocate for mmap write */ BMAPI_TRYLOCK = (1 << 7), /* non-blocking request */ } bmapi_flags_t; @@ -36,7 +35,6 @@ typedef enum { { BMAPI_ALLOCATE, "ALLOCATE" }, \ { BMAPI_IGNSTATE, "IGNSTATE" }, \ { BMAPI_DIRECT, "DIRECT" }, \ - { BMAPI_MMAP, "MMAP" }, \ { BMAPI_TRYLOCK, "TRYLOCK" } struct xfs_inode; From grafgrimm77@gmx.de Mon Jun 21 06:32:47 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM 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 o5LBWlL3120101 for ; Mon, 21 Jun 2010 06:32:47 -0500 X-ASG-Debug-ID: 1277120126-221b02be0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.gmx.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 6E60D3EFE07 for ; Mon, 21 Jun 2010 04:35:26 -0700 (PDT) Received: from mail.gmx.net (mail.gmx.net [213.165.64.20]) by cuda.sgi.com with SMTP id lgHj0vEuIjzKSsiF for ; Mon, 21 Jun 2010 04:35:26 -0700 (PDT) Received: (qmail invoked by alias); 21 Jun 2010 11:35:25 -0000 Received: from p4FDD1F96.dip.t-dialin.net (EHLO server.grafnetz) [79.221.31.150] by mail.gmx.net (mp005) with SMTP; 21 Jun 2010 13:35:25 +0200 X-Authenticated: #1282162 X-Provags-ID: V01U2FsdGVkX1/TEcxOQHLTSctw2H70jMC+REL7LTxVb6fBLlKFxP 2tsvTiNdTPudjr Received: from x2.grafnetz ([192.168.0.4]) by server.grafnetz with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.72) (envelope-from ) id 1OQfHe-0003CG-6R; Mon, 21 Jun 2010 13:35:23 +0200 Date: Mon, 21 Jun 2010 13:35:21 +0200 From: Mario Bachmann To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: vmalloc, xfs_buf_get: failed to map pages Subject: Re: vmalloc, xfs_buf_get: failed to map pages Message-ID: <20100621133521.4eb1a891@x2.grafnetz> In-Reply-To: <20100621072118.GA1361@infradead.org> References: <20100619150119.3ce64102@x2.grafnetz> <20100621072118.GA1361@infradead.org> X-Mailer: Claws Mail 3.7.6 (GTK+ 2.20.1; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Y-GMX-Trusted: 0 X-Barracuda-Connect: mail.gmx.net[213.165.64.20] X-Barracuda-Start-Time: 1277120127 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33131 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Am Mon, 21 Jun 2010 03:21:18 -0400 schrieb Christoph Hellwig : > On Sat, Jun 19, 2010 at 03:01:19PM +0200, Mario Bachmann wrote: > > Hello, > > > > on a 32bit machine, I have big problems with Linux 2.6.34. > > With Linux 2.6.33.4 everything runs fine. > > > > I do not know where to search for known bugs in xfs. > > > > /var/log/messages shows a lot of lines: > > > > Jun 19 11:43:15 amd2000 kernel: vmap allocation for size 4194304 failed: use vmalloc= to increase size. > > Jun 19 11:43:15 amd2000 kernel: xfs_buf_get: failed to map pages > > > > What to to? > > Strange. There have been no fixes to the vmap allocator nor to the > XFS using this. What other modules are you ising? Maybe they increased > their amount of used vmalloc space. For now the only thing you can do > is using the vmalloc= kernel paramter to increase the vmalloc space. What is the command to get all used modules? Here is the output of the old kernel (2.6.33.4). I used the same kernel-.config for the new kernel (2.6.34): amd2000 ~ # cat /proc/modules sch_sfq 4645 1 - Live 0xf9537000 nfsd 219445 13 - Live 0xf9301000 ipv6 201317 34 - Live 0xf9283000 nf_conntrack_ftp 4780 0 - Live 0xf9238000 nf_conntrack_irc 2587 0 - Live 0xf922d000 ipt_REJECT 1785 2 - Live 0xf8782000 xt_tcpudp 1863 64 - Live 0xf85cc000 nf_conntrack_ipv4 7781 65 - Live 0xf85c0000 nf_defrag_ipv4 747 1 nf_conntrack_ipv4, Live 0xf85b4000 xt_state 919 65 - Live 0xf85ab000 ipt_LOG 4203 12 - Live 0xf8586000 xt_limit 1140 14 - Live 0xf857c000 iptable_filter 1034 1 - Live 0xf84d4000 ipt_addrtype 1449 0 - Live 0xf84ca000 xt_DSCP 1499 0 - Live 0xf84c1000 xt_dscp 1155 0 - Live 0xf84b8000 xt_string 1051 0 - Live 0xf84af000 xt_owner 791 6 - Live 0xf84a6000 xt_NFQUEUE 1565 0 - Live 0xf849d000 xt_multiport 2163 0 - Live 0xf8494000 xt_MARK 597 0 - Live 0xf848a000 xt_mark 597 0 - Live 0xf8481000 xt_iprange 1112 0 - Live 0xf8478000 xt_hashlimit 7490 0 - Live 0xf846e000 xt_conntrack 2183 0 - Live 0xf8462000 xt_CONNMARK 963 0 - Live 0xf8458000 xt_connmark 803 0 - Live 0xf803e000 nf_conntrack 38512 7 nf_conntrack_ftp,nf_conntrack_irc,nf_conntrack_ipv4,xt_state,xt_conntrack,xt_CONNMARK,xt_connmark, Live 0xf843f000 ip_tables 7645 1 iptable_filter, Live 0xf8034000 x_tables 9456 20 ipt_REJECT,xt_tcpudp,xt_state,ipt_LOG,xt_limit,ipt_addrtype,xt_DSCP,xt_dscp,xt_string,xt_owner,xt_NFQUEUE,xt_multiport,xt_MARK,xt_mark,xt_iprange,xt_hashlimit,xt_conntrack,xt_CONNMARK,xt_connmark,ip_tables, Live 0xf800d000 snd_ens1371 13650 0 - Live 0xfa21d000 gameport 6213 1 snd_ens1371, Live 0xfa20d000 snd_rawmidi 14248 1 snd_ens1371, Live 0xfa1fd000 snd_intel8x0 21243 0 - Live 0xfa1e8000 snd_seq_device 4105 1 snd_rawmidi, Live 0xfa1d5000 snd_ac97_codec 85509 2 snd_ens1371,snd_intel8x0, Live 0xfa190000 ac97_bus 702 1 snd_ac97_codec, Live 0xfa166000 snd_pcm 48336 3 snd_ens1371,snd_intel8x0,snd_ac97_codec, Live 0xfa0ef000 snd_timer 14100 1 snd_pcm, Live 0xfa0ca000 nvidia 9829303 0 - Live 0xf9636000 (P) ppdev 5090 0 - Live 0xf8bdd000 parport_pc 23336 0 - Live 0xf8bbe000 snd 36462 7 snd_ens1371,snd_rawmidi,snd_intel8x0,snd_seq_device,snd_ac97_codec,snd_pcm,snd_timer, Live 0xf8b95000 parport 24435 2 ppdev,parport_pc, Live 0xf8b70000 snd_page_alloc 5345 2 snd_intel8x0,snd_pcm, Live 0xf8012000 What is a good value for vmalloc= ? The machine has 1 GB of RAM. Mario From xiaowei.hu@oracle.com Tue Jun 22 02:15:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_52 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5M7FwBY229270 for ; Tue, 22 Jun 2010 02:15:58 -0500 X-ASG-Debug-ID: 1277191118-5a85032f0000-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 EA9213F6937 for ; Tue, 22 Jun 2010 00:18:38 -0700 (PDT) Received: from rcsinet10.oracle.com (rcsinet10.oracle.com [148.87.113.121]) by cuda.sgi.com with ESMTP id mkLYKVFAitZ34b7f for ; Tue, 22 Jun 2010 00:18:38 -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.2) with ESMTP id o5M7IAkY018553 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 22 Jun 2010 07:18:14 GMT Received: from acsmt353.oracle.com (acsmt353.oracle.com [141.146.40.153]) by acsinet15.oracle.com (Switch-3.4.2/Switch-3.4.1) with ESMTP id o5M6qirK017837; Tue, 22 Jun 2010 07:18:09 GMT Received: from abhmt016.oracle.com by acsmt353.oracle.com with ESMTP id 362653091277191026; Tue, 22 Jun 2010 00:17:06 -0700 Received: from [10.182.120.139] (/10.182.120.139) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 22 Jun 2010 00:17:03 -0700 X-ASG-Orig-Subj: Re: segment fault when running xfs_check -s Subject: Re: segment fault when running xfs_check -s From: xiaowei hu Reply-To: xiaowei.hu@oracle.com To: Dave Chinner Cc: xfs@oss.sgi.com, wen.gang.wang@oracle.com In-Reply-To: <20100621053803.GK6590@dastard> References: <1277088918.20616.81.camel@redfuture-desktop> <20100621053803.GK6590@dastard> Content-Type: text/plain; charset="UTF-8" Organization: Oracle Date: Tue, 22 Jun 2010 15:17:00 +0800 Message-ID: <1277191020.1636.7.camel@redfuture-desktop> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-Auth-Type: Internal IP X-Source-IP: acsinet15.oracle.com [141.146.126.227] X-CT-RefId: str=0001.0A090201.4C2063BF.0238:SCFMA922111,ss=1,fgs=0 X-Barracuda-Connect: rcsinet10.oracle.com[148.87.113.121] X-Barracuda-Start-Time: 1277191118 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33209 Rule breakdown below pts rule 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, I tried this patch,it fixes this bug, thank you very much:) Regards, Xiaowei On Mon, 2010-06-21 at 15:38 +1000, Dave Chinner wrote: > On Mon, Jun 21, 2010 at 10:55:18AM +0800, xiaowei hu wrote: > > Hi, > > > > Recently I was playing with xfsprogs, and did some test on xfs_check > > tools in this mothod: > > 1.make a xfs fs on one partition. > > mkfs.xfs -f /dev/sda2 > > 2.randomly modify some blocks on this volume using xfs_db. > > xfs_db -x -c blockget -c "blocktrash -3 -s 36 -n 81" /dev/sda2 > > 3.run xfs_check -s > > xfs_check -s /dev/sda2 > > > > the output saying: > > [root@test1 ~]# xfs_check -s /dev/sda2 > > bad version number 0x78 for inode 135 > > bad magic number 0xa855 for inode 154 > > bad magic number 0x5024 for inode 165 > > /usr/local/bin/xfs_check: line 28: 769 Segmentation fault xfs_db > > $DBOPTS -F -i -p xfs_check -c "blockget$OPTS" $1 > > > > if I run xfs_check without -s option, don't have this fault. > > > > Is this a known problem? > > No. > > > I tried the latest code ,also have this problem. > > Yeah, the code determining whether to output a message is broken: > > 2651 if (!isfree) { > 2652 id = find_inode(ino, 1); > 2653 bno = XFS_INO_TO_FSB(mp, ino); > 2654 blkmap = NULL; > 2655 } > > find_inode() checks a list created by the "-i " command line > option, so will always return NULL for this test case. Most of the checks > do this: > > 2657 if (!sflag || isfree || id->ilist || CHECK_BLIST(bno)) > > sflag is set by the "-s" command line option, which is why this > problem requires that to be set - the output checks don't get past > this otherwise. > > isfree is a parameter passed into to say whether the inode is > allocated or not. The code hence assumes that if !isfree, then id != > NULL, which is certainly not the case. Hence it can blow up if id = > NULL. > > The line it crashed on: > > 2670 if (isfree) { > 2671 if (idic.di_nblocks != 0) { > 2672 >>>>>> if (!sflag || id->ilist || CHECK_BLIST(bno)) > > Looks like a clear case of copy-n-paste error - if isfree is set, the > id _must_ be null and we go kaboom. > > It looks like none of the code in this function actually checks for > whether id is valid or not after find_inode and dereferencing the > reurn pointer. > > The patch below should fix the problem. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > --- > db/check.c | 29 ++++++++++++++++------------- > 1 files changed, 16 insertions(+), 13 deletions(-) > > diff --git a/db/check.c b/db/check.c > index 7620d9c..e0dcf63 100644 > --- a/db/check.c > +++ b/db/check.c > @@ -2619,6 +2619,7 @@ process_inode( > xfs_qcnt_t ic = 0; > xfs_qcnt_t rc = 0; > xfs_dqid_t dqprid; > + int v = 0; > static char okfmts[] = { > 0, /* type 0 unused */ > 1 << XFS_DINODE_FMT_DEV, /* FIFO */ > @@ -2653,15 +2654,16 @@ process_inode( > bno = XFS_INO_TO_FSB(mp, ino); > blkmap = NULL; > } > + v = (!sflag || (id && id->ilist) || CHECK_BLIST(bno)); > if (idic.di_magic != XFS_DINODE_MAGIC) { > - if (!sflag || isfree || id->ilist || CHECK_BLIST(bno)) > + if (isfree || v) > dbprintf(_("bad magic number %#x for inode %lld\n"), > idic.di_magic, ino); > error++; > return; > } > if (!XFS_DINODE_GOOD_VERSION(idic.di_version)) { > - if (!sflag || isfree || id->ilist || CHECK_BLIST(bno)) > + if (isfree || v) > dbprintf(_("bad version number %#x for inode %lld\n"), > idic.di_version, ino); > error++; > @@ -2669,7 +2671,7 @@ process_inode( > } > if (isfree) { > if (idic.di_nblocks != 0) { > - if (!sflag || id->ilist || CHECK_BLIST(bno)) > + if (v) > dbprintf(_("bad nblocks %lld for free inode " > "%lld\n"), > idic.di_nblocks, ino); > @@ -2680,21 +2682,22 @@ process_inode( > else > nlink = idic.di_nlink; > if (nlink != 0) { > - if (!sflag || id->ilist || CHECK_BLIST(bno)) > + if (v) > dbprintf(_("bad nlink %d for free inode %lld\n"), > nlink, ino); > error++; > } > if (idic.di_mode != 0) { > - if (!sflag || id->ilist || CHECK_BLIST(bno)) > + if (v) > dbprintf(_("bad mode %#o for free inode %lld\n"), > idic.di_mode, ino); > error++; > } > return; > } > + > if (be32_to_cpu(dip->di_next_unlinked) != NULLAGINO) { > - if (!sflag || isfree || id->ilist || CHECK_BLIST(bno)) > + if (v) > dbprintf(_("bad next unlinked %#x for inode %lld\n"), > be32_to_cpu(dip->di_next_unlinked), ino); > error++; > @@ -2704,27 +2707,27 @@ process_inode( > */ > if ((((idic.di_mode & S_IFMT) >> 12) > 15) || > (!(okfmts[(idic.di_mode & S_IFMT) >> 12] & (1 << idic.di_format)))) { > - if (!sflag || id->ilist || CHECK_BLIST(bno)) > + if (v) > dbprintf(_("bad format %d for inode %lld type %#o\n"), > idic.di_format, id->ino, idic.di_mode & S_IFMT); > error++; > return; > } > if ((unsigned int)XFS_DFORK_ASIZE(dip, mp) >= XFS_LITINO(mp)) { > - if (!sflag || id->ilist) > + if (v) > dbprintf(_("bad fork offset %d for inode %lld\n"), > idic.di_forkoff, id->ino); > error++; > return; > } > if ((unsigned int)idic.di_aformat > XFS_DINODE_FMT_BTREE) { > - if (!sflag || id->ilist) > + if (v) > dbprintf(_("bad attribute format %d for inode %lld\n"), > idic.di_aformat, id->ino); > error++; > return; > } > - if (verbose || id->ilist || CHECK_BLIST(bno)) > + if (verbose || v) > dbprintf(_("inode %lld mode %#o fmt %s " > "afmt %s " > "nex %d anex %d nblk %lld sz %lld%s%s%s%s%s%s%s\n"), > @@ -2844,20 +2847,20 @@ process_inode( > } > totblocks = totdblocks + totiblocks + atotdblocks + atotiblocks; > if (totblocks != idic.di_nblocks) { > - if (!sflag || id->ilist || CHECK_BLIST(bno)) > + if (v) > dbprintf(_("bad nblocks %lld for inode %lld, counted " > "%lld\n"), > idic.di_nblocks, id->ino, totblocks); > error++; > } > if (nextents != idic.di_nextents) { > - if (!sflag || id->ilist || CHECK_BLIST(bno)) > + if (v) > dbprintf(_("bad nextents %d for inode %lld, counted %d\n"), > idic.di_nextents, id->ino, nextents); > error++; > } > if (anextents != idic.di_anextents) { > - if (!sflag || id->ilist || CHECK_BLIST(bno)) > + if (v) > dbprintf(_("bad anextents %d for inode %lld, counted " > "%d\n"), > idic.di_anextents, id->ino, anextents); From BATV+426d469270cba0530d86+2494+infradead.org+hch@bombadil.srs.infradead.org Tue Jun 22 07:28:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_63 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 o5MCSWBc237975 for ; Tue, 22 Jun 2010 07:28:34 -0500 X-ASG-Debug-ID: 1277209873-78cd02390000-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 618621514BC4 for ; Tue, 22 Jun 2010 05:31:13 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id slFGi7Vg4hWxCrOh for ; Tue, 22 Jun 2010 05:31:13 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OR2dE-0004vh-UZ; Tue, 22 Jun 2010 12:31:12 +0000 Message-Id: <20100622122144.302857146@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Tue, 22 Jun 2010 08:21:44 -0400 From: Christoph Hellwig To: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org X-ASG-Orig-Subj: [PATCH 0/2] Fix aio completion vs unwritten extents Subject: [PATCH 0/2] Fix aio completion vs unwritten extents 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: 1277209873 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Some filesystems (XFS and ext4) have support for a concept called unwritten extents, where we can write data into holes / preallocated space and only mark them as allocated when the data I/O has finished. Because the transaction to convert the extent can't be submitted from I/O completion, which normally happens from IRQ context it needs to be defered to a workqueue. This is not a problem for buffered I/O where we keep the data in cache at least until the I/O operation has finished, but it is an issue for direct I/O. XFS avoids that problem for synchronous direct I/O by waiting for all unwritten extent conversions to finish if we did one during direct I/O, but so far has ignored the problem for asynchronous I/O. Unfortunately the race is very easy to hit by using QEMU with native AIO support on a sparse image, and the result is filesystem corruption in the guest. This contains core direct I/O changes to allow the filesystem to delay AIO completion, as well as a patch to fix XFS. ext4 also has the same issue, and from a quick look also doesn't properly complete unwritten extent conversions for synchronous direct I/O, but I'll leave that for someone more familar to figure out. Below is a minimal reproducer for the issue. Given that we're dealing with a race condition it doesn't always fail, but in 2 core laptop it triggers 100% reproducibly in 20 runs in a loop. --- #define _GNU_SOURCE #include #include #include #include #include #include #include #include #define BUF_SIZE 4096 #define IO_PATTERN 0xab int main(int argc, char *argv[]) { struct io_context *ctx = NULL; struct io_event ev; struct iocb iocb, *iocbs[] = { &iocb }; void *buf; char cmp_buf[BUF_SIZE]; int fd, err = 0; fd = open(argv[1], O_DIRECT | O_CREAT | O_TRUNC | O_RDWR, 0600); if (fd == -1) { perror("open"); return 1; } err = posix_memalign(&buf, BUF_SIZE, BUF_SIZE); if (err) { fprintf(stderr, "error %s during %s\n", strerror(-err), "posix_memalign"); return 1; } memset(buf, IO_PATTERN, BUF_SIZE); memset(cmp_buf, IO_PATTERN, BUF_SIZE); /* * Truncate to some random large file size. Just make sure * it's not smaller than our I/O size. */ if (ftruncate(fd, 1024 * 1024 * 1024) < 0) { perror("ftruncate"); return 1; } /* * Do a simple 4k write into a hole using aio. */ err = io_setup(1, &ctx); if (err) { fprintf(stderr, "error %s during %s\n", strerror(-err), "io_setup"); return 1; } io_prep_pwrite(&iocb, fd, buf, BUF_SIZE, 0); err = io_submit(ctx, 1, iocbs); if (err != 1) { fprintf(stderr, "error %s during %s\n", strerror(-err), "io_submit"); return 1; } err = io_getevents(ctx, 1, 1, &ev, NULL); if (err != 1) { fprintf(stderr, "error %s during %s\n", strerror(-err), "io_getevents"); return 1; } /* * And then read it back. * * Using pread to keep it simple, but AIO has the same effect. */ if (pread(fd, buf, BUF_SIZE, 0) != BUF_SIZE) { perror("pread"); return 1; } /* * And depending on the machine we'll just get zeroes back quite * often here. That's because the unwritten extent conversion * hasn't finished. */ if (memcmp(buf, cmp_buf, BUF_SIZE)) { unsigned long long *ubuf = (unsigned long long *)buf; int i; for (i = 0; i < BUF_SIZE / sizeof(unsigned long long); i++) printf("%d: 0x%llx\n", i, ubuf[i]); return 1; } return 0; } From BATV+426d469270cba0530d86+2494+infradead.org+hch@bombadil.srs.infradead.org Tue Jun 22 07:28: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 o5MCShE7237996 for ; Tue, 22 Jun 2010 07:28:43 -0500 X-ASG-Debug-ID: 1277210124-4b9600310000-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 AA20B14ACD7D for ; Tue, 22 Jun 2010 05:35:25 -0700 (PDT) Received: from bombadil.infradead.org ([18.85.46.34]) by cuda.sgi.com with ESMTP id P52YTNiBwVTaMCg4 for ; Tue, 22 Jun 2010 05:35:25 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OR2dF-0004wr-9K; Tue, 22 Jun 2010 12:31:13 +0000 Message-Id: <20100622123113.205150586@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Tue, 22 Jun 2010 08:21:46 -0400 From: Christoph Hellwig To: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org X-ASG-Orig-Subj: [PATCH 2/2] xfs: move aio completion after unwritten extent conversion Subject: [PATCH 2/2] xfs: move aio completion after unwritten extent conversion References: <20100622122144.302857146@bombadil.infradead.org> Content-Disposition: inline; filename=xfs-unwritten-fix 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: 1277210125 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean If we write into an unwritten extent using AIO we need to complete the AIO request after the extent conversion has finished. Without that a read could race to see see the extent still unwritten and return zeros. For synchronous I/O we already take care of that by flushing the xfsconvertd workqueue (which might be a bit of overkill). To do that add iocb and result fields to struct xfs_ioend, so that we can call aio_complete from xfs_end_io after the extent conversion has happened. Note that we need a new result field as io_error is used for positive errno values, while the AIO code can return negative error values and positive transfer sizes. Signed-off-by: Christoph Hellwig Index: linux-2.6/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-06-22 14:05:02.522005722 +0200 +++ linux-2.6/fs/xfs/linux-2.6/xfs_aops.c 2010-06-22 14:08:30.065006205 +0200 @@ -275,8 +275,11 @@ xfs_end_io( xfs_finish_ioend(ioend, 0); /* ensure we don't spin on blocked ioends */ delay(1); - } else + } else { + if (ioend->io_iocb) + aio_complete(ioend->io_iocb, ioend->io_result, 0); xfs_destroy_ioend(ioend); + } } /* @@ -309,6 +312,8 @@ xfs_alloc_ioend( atomic_inc(&XFS_I(ioend->io_inode)->i_iocount); ioend->io_offset = 0; ioend->io_size = 0; + ioend->io_iocb = NULL; + ioend->io_result = 0; INIT_WORK(&ioend->io_work, xfs_end_io); return ioend; @@ -1604,6 +1609,7 @@ xfs_end_io_direct( bool is_async) { xfs_ioend_t *ioend = iocb->private; + bool complete_aio = is_async; /* * Non-NULL private data means we need to issue a transaction to @@ -1629,7 +1635,14 @@ xfs_end_io_direct( if (ioend->io_type == IO_READ) { xfs_finish_ioend(ioend, 0); } else if (private && size > 0) { - xfs_finish_ioend(ioend, is_sync_kiocb(iocb)); + if (is_async) { + ioend->io_iocb = iocb; + ioend->io_result = ret; + complete_aio = false; + xfs_finish_ioend(ioend, 0); + } else { + xfs_finish_ioend(ioend, 1); + } } else { /* * A direct I/O write ioend starts it's life in unwritten @@ -1648,7 +1661,7 @@ xfs_end_io_direct( */ iocb->private = NULL; - if (is_async) + if (complete_aio) aio_complete(iocb, ret, 0); } From BATV+426d469270cba0530d86+2494+infradead.org+hch@bombadil.srs.infradead.org Tue Jun 22 07:28: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 o5MCSh8V237997 for ; Tue, 22 Jun 2010 07:28:43 -0500 X-ASG-Debug-ID: 1277210124-4b97003e0000-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 B527014ACD7E for ; Tue, 22 Jun 2010 05:35:24 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id sS5h7hdqVjn7MG6D for ; Tue, 22 Jun 2010 05:35:24 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OR2dF-0004wI-3a; Tue, 22 Jun 2010 12:31:13 +0000 Message-Id: <20100622123113.011371666@bombadil.infradead.org> User-Agent: quilt/0.47-1 Date: Tue, 22 Jun 2010 08:21:45 -0400 From: Christoph Hellwig To: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org X-ASG-Orig-Subj: [PATCH 1/2] direct-io: move aio_complete into ->end_io Subject: [PATCH 1/2] direct-io: move aio_complete into ->end_io References: <20100622122144.302857146@bombadil.infradead.org> Content-Disposition: inline; filename=direct-io-unwritten-fix 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: 1277210126 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Filesystems with unwritten extent support must not complete an AIO request until the transaction to convert the extent has been commited. That means the aio_complete calls needs to be moved into the ->end_io callback so that the filesystem can control when to call it exactly. This makes a bit of a mess out of dio_complete and the ->end_io callback prototype even more complicated. In addition ->end_io is now called with i_alloc_sem held for DIO_LOCKING filesystems. The only filesystem that has both and ->end_io callback and sets DIO_LOCKING is ext4, which doesn't appear to do anything that could deadlock with i_alloc_sem in ->end_io. Signed-off-by: Christoph Hellwig Index: linux-2.6/fs/direct-io.c =================================================================== --- linux-2.6.orig/fs/direct-io.c 2010-06-22 09:48:37.239004298 +0200 +++ linux-2.6/fs/direct-io.c 2010-06-22 11:54:42.281003878 +0200 @@ -218,7 +218,7 @@ static struct page *dio_get_page(struct * filesystems can use it to hold additional state between get_block calls and * dio_complete. */ -static int dio_complete(struct dio *dio, loff_t offset, int ret) +static int dio_complete(struct dio *dio, loff_t offset, int ret, bool is_async) { ssize_t transferred = 0; @@ -239,14 +239,6 @@ static int dio_complete(struct dio *dio, transferred = dio->i_size - offset; } - if (dio->end_io && dio->result) - dio->end_io(dio->iocb, offset, transferred, - dio->map_bh.b_private); - - if (dio->flags & DIO_LOCKING) - /* lockdep: non-owner release */ - up_read_non_owner(&dio->inode->i_alloc_sem); - if (ret == 0) ret = dio->page_errors; if (ret == 0) @@ -254,6 +246,17 @@ static int dio_complete(struct dio *dio, if (ret == 0) ret = transferred; + if (dio->end_io && dio->result) { + dio->end_io(dio->iocb, offset, transferred, + dio->map_bh.b_private, ret, is_async); + } else if (is_async) { + aio_complete(dio->iocb, ret, 0); + } + + if (dio->flags & DIO_LOCKING) + /* lockdep: non-owner release */ + up_read_non_owner(&dio->inode->i_alloc_sem); + return ret; } @@ -277,8 +280,7 @@ static void dio_bio_end_aio(struct bio * spin_unlock_irqrestore(&dio->bio_lock, flags); if (remaining == 0) { - int ret = dio_complete(dio, dio->iocb->ki_pos, 0); - aio_complete(dio->iocb, ret, 0); + dio_complete(dio, dio->iocb->ki_pos, 0, true); kfree(dio); } } @@ -1126,7 +1128,7 @@ direct_io_worker(int rw, struct kiocb *i spin_unlock_irqrestore(&dio->bio_lock, flags); if (ret2 == 0) { - ret = dio_complete(dio, offset, ret); + ret = dio_complete(dio, offset, ret, false); kfree(dio); } else BUG_ON(ret != -EIOCBQUEUED); Index: linux-2.6/fs/ext4/inode.c =================================================================== --- linux-2.6.orig/fs/ext4/inode.c 2010-06-22 09:48:37.249004508 +0200 +++ linux-2.6/fs/ext4/inode.c 2010-06-22 12:18:45.883255381 +0200 @@ -3775,7 +3775,8 @@ static ext4_io_end_t *ext4_init_io_end ( } static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, - ssize_t size, void *private) + ssize_t size, void *private, int ret, + bool is_async) { ext4_io_end_t *io_end = iocb->private; struct workqueue_struct *wq; @@ -3784,7 +3785,7 @@ static void ext4_end_io_dio(struct kiocb /* if not async direct IO or dio with 0 bytes write, just return */ if (!io_end || !size) - return; + goto out; ext_debug("ext4_end_io_dio(): io_end 0x%p" "for inode %lu, iocb 0x%p, offset %llu, size %llu\n", @@ -3795,7 +3796,7 @@ static void ext4_end_io_dio(struct kiocb if (io_end->flag != EXT4_IO_UNWRITTEN){ ext4_free_io_end(io_end); iocb->private = NULL; - return; + goto out; } io_end->offset = offset; @@ -3812,6 +3813,9 @@ static void ext4_end_io_dio(struct kiocb list_add_tail(&io_end->list, &ei->i_completed_io_list); spin_unlock_irqrestore(&ei->i_completed_io_lock, flags); iocb->private = NULL; +out: + if (is_async) + aio_complete(iocb, ret, 0); } static void ext4_end_io_buffer_write(struct buffer_head *bh, int uptodate) Index: linux-2.6/fs/ocfs2/aops.c =================================================================== --- linux-2.6.orig/fs/ocfs2/aops.c 2010-06-22 09:48:37.259012749 +0200 +++ linux-2.6/fs/ocfs2/aops.c 2010-06-22 12:19:03.931005757 +0200 @@ -609,7 +609,9 @@ bail: static void ocfs2_dio_end_io(struct kiocb *iocb, loff_t offset, ssize_t bytes, - void *private) + void *private, + int ret, + bool is_async) { struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode; int level; @@ -623,6 +625,9 @@ static void ocfs2_dio_end_io(struct kioc if (!level) up_read(&inode->i_alloc_sem); ocfs2_rw_unlock(inode, level); + + if (is_async) + aio_complete(iocb, ret, 0); } /* Index: linux-2.6/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-06-22 09:48:37.268012190 +0200 +++ linux-2.6/fs/xfs/linux-2.6/xfs_aops.c 2010-06-22 14:05:02.522005722 +0200 @@ -1599,7 +1599,9 @@ xfs_end_io_direct( struct kiocb *iocb, loff_t offset, ssize_t size, - void *private) + void *private, + int ret, + bool is_async) { xfs_ioend_t *ioend = iocb->private; @@ -1645,6 +1647,9 @@ xfs_end_io_direct( * against double-freeing. */ iocb->private = NULL; + + if (is_async) + aio_complete(iocb, ret, 0); } STATIC ssize_t Index: linux-2.6/fs/xfs/linux-2.6/xfs_aops.h =================================================================== --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_aops.h 2010-06-22 09:48:37.278274238 +0200 +++ linux-2.6/fs/xfs/linux-2.6/xfs_aops.h 2010-06-22 09:49:12.388034051 +0200 @@ -37,6 +37,8 @@ typedef struct xfs_ioend { size_t io_size; /* size of the extent */ xfs_off_t io_offset; /* offset in the file */ struct work_struct io_work; /* xfsdatad work queue */ + struct kiocb *io_iocb; + int io_result; } xfs_ioend_t; extern const struct address_space_operations xfs_address_space_operations; Index: linux-2.6/include/linux/fs.h =================================================================== --- linux-2.6.orig/include/linux/fs.h 2010-06-22 09:49:07.188253984 +0200 +++ linux-2.6/include/linux/fs.h 2010-06-22 10:34:10.128005975 +0200 @@ -415,7 +415,8 @@ struct buffer_head; typedef int (get_block_t)(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create); typedef void (dio_iodone_t)(struct kiocb *iocb, loff_t offset, - ssize_t bytes, void *private); + ssize_t bytes, void *private, int ret, + bool is_async); /* * Attribute flags. These should be or-ed together to figure out what From rolek@bokxing.nl Tue Jun 22 09:34:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5MEY7vZ241771 for ; Tue, 22 Jun 2010 09:34:08 -0500 X-ASG-Debug-ID: 1277217657-5f8502cb0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bork.lsof.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B202E131A44E for ; Tue, 22 Jun 2010 07:40:57 -0700 (PDT) Received: from bork.lsof.org (bork.lsof.org [87.253.148.42]) by cuda.sgi.com with ESMTP id aL9tnQJEVNx3UBLi for ; Tue, 22 Jun 2010 07:40:57 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by bork.lsof.org (Postfix) with ESMTP id 2E072BB1F for ; Tue, 22 Jun 2010 16:36:45 +0200 (CEST) Received: from bork.lsof.org ([127.0.0.1]) by localhost (bork.lsof.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id CXwukQLb4pLt for ; Tue, 22 Jun 2010 16:36:43 +0200 (CEST) Received: from bork.lsof.org (localhost [127.0.0.1]) by bork.lsof.org (Postfix) with ESMTP id E332FBA45 for ; Tue, 22 Jun 2010 16:36:42 +0200 (CEST) Message-ID: X-Mailer: http://www.courier-mta.org/cone/ From: Roel van Meer To: xfs@oss.sgi.com X-ASG-Orig-Subj: advice for repair after IO error on raid device Subject: advice for repair after IO error on raid device Date: Tue, 22 Jun 2010 16:36:42 +0200 Mime-Version: 1.0 Content-Type: text/plain; format=flowed; charset="US-ASCII" Content-Disposition: inline Content-Transfer-Encoding: 7bit X-Barracuda-Connect: bork.lsof.org[87.253.148.42] X-Barracuda-Start-Time: 1277217659 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33239 Rule breakdown below pts rule 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 list, I recently I had a failed disk in a raid6 setup, which resulted in an IO error, which in turn caused XFS to shut down with the messages below. I've seen on this list that incorrect use of xfs_repair might damage the fs even more, so I would like to ask for some advice on the best way to proceed. Currently I have unmounted the filesystem, replaced the failed disk and rebuilt the raid array. I am upgrading xfstools to their latest version (the current version is 2.9.8). Any hints on how to continue would be highly appreciated. Background: This is a Fedora Core 3 machine, with a vanilla 2.6.31 kernel. The raid setup consists of 24x2TB disks in a raid6 setup. We use it to store our backup snapshots and the entire volume is written to tape once a week. Thanks in advance, roel Jun 21 23:23:59 backup2 kernel: arcmsr6: abort device command of scsi id = 0 lun = 0 Jun 21 23:24:10 backup2 kernel: arcmsr6: ccb ='0xffff8800cb88ad40'????????????????????????????? isr got aborted command Jun 21 23:24:10 backup2 kernel: arcmsr6: isr get an illegal ccb command???????????????????????????????? done acb = '0xffff880231c90408'ccb = '0xffff8800cb88ad40' ccbacb = '0xffff880231c90408' startdone = 0x0 ccboutstandingcount = 1 Jun 21 23:24:10 backup2 kernel: sd 6:0:0:0: [sdb] Unhandled error code Jun 21 23:24:10 backup2 kernel: sd 6:0:0:0: [sdb] Result: hostbyte=DID_ABORT driverbyte=DRIVER_OK Jun 21 23:24:10 backup2 kernel: end_request: I/O error, dev sdb, sector 12887056410 Jun 21 23:24:10 backup2 kernel: I/O error in filesystem ("sdb1") meta-data dev sdb1 block 0x30020dff8?????? ("xfs_trans_read_buf") error 5 buf count 4096 Jun 21 23:24:10 backup2 kernel: xfs_force_shutdown(sdb1,0x1) called from line 414 of file fs/xfs/xfs_trans_buf.c.? Return address = 0xffffffffa0168eaf Jun 21 23:24:10 backup2 kernel: xfs_force_shutdown(sdb1,0x2) called from line 811 of file fs/xfs/xfs_log.c.? Return address = 0xffffffffa015c35f Jun 21 23:24:10 backup2 kernel: Filesystem "sdb1": I/O Error Detected.? Shutting down filesystem: sdb1 Jun 21 23:24:10 backup2 kernel: Please umount the filesystem, and rectify the problem(s) Jun 21 23:24:20 backup2 kernel: Filesystem "sdb1": xfs_log_force: error 5 returned. Jun 21 23:24:50 backup2 kernel: Filesystem "sdb1": xfs_log_force: error 5 returned. Jun 21 23:25:20 backup2 kernel: Filesystem "sdb1": xfs_log_force: error 5 returned. From rolek@bokxing.nl Tue Jun 22 09:50:55 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5MEoth5242322 for ; Tue, 22 Jun 2010 09:50:55 -0500 X-ASG-Debug-ID: 1277218666-5f5f03780000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bork.lsof.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id ED468159FA4E for ; Tue, 22 Jun 2010 07:57:47 -0700 (PDT) Received: from bork.lsof.org (bork.lsof.org [87.253.148.42]) by cuda.sgi.com with ESMTP id h2Xpa1NquZvdN5pE for ; Tue, 22 Jun 2010 07:57:47 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by bork.lsof.org (Postfix) with ESMTP id F2A74BB1F for ; Tue, 22 Jun 2010 16:53:34 +0200 (CEST) Received: from bork.lsof.org ([127.0.0.1]) by localhost (bork.lsof.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id m-YZayhbAN58 for ; Tue, 22 Jun 2010 16:53:32 +0200 (CEST) Received: from bork.lsof.org (localhost [127.0.0.1]) by bork.lsof.org (Postfix) with ESMTP id B2458BA18 for ; Tue, 22 Jun 2010 16:53:32 +0200 (CEST) References: Message-ID: X-Mailer: http://www.courier-mta.org/cone/ From: Roel van Meer To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: advice for repair after IO error on raid device Subject: Re: advice for repair after IO error on raid device Date: Tue, 22 Jun 2010 16:53:32 +0200 Mime-Version: 1.0 Content-Type: text/plain; format=flowed; charset="US-ASCII" Content-Disposition: inline Content-Transfer-Encoding: 7bit X-Barracuda-Connect: bork.lsof.org[87.253.148.42] X-Barracuda-Start-Time: 1277218667 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33239 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Roel van Meer writes: > Currently I have unmounted the filesystem, replaced the failed disk and > rebuilt the raid array. I am upgrading xfstools to their latest version (the > current version is 2.9.8). Any hints on how to continue would be highly > appreciated. Trying to answer my own question. I _think_ this is the way to go: 1) Mount and unmount the fs, in order to replay the log. 2) Run xfs_repair -n 3) Run xfs_repair If someone could confirm (or reject) that, that would be great. (By the way, is it necessary to run xfs_repair with -n first? If not, are there advantages that would justify the extra time it takes?) Thanks again, roel > Jun 21 23:23:59 backup2 kernel: arcmsr6: abort device command of scsi id = 0 lun = 0 > Jun 21 23:24:10 backup2 kernel: arcmsr6: ccb ='0xffff8800cb88ad40'????????????????????????????? isr got aborted command > Jun 21 23:24:10 backup2 kernel: arcmsr6: isr get an illegal ccb command???????????????????????????????? done acb = '0xffff880231c90408'ccb = '0xffff8800cb88ad40' ccbacb = '0xffff880231c90408' startdone = 0x0 ccboutstandingcount = 1 > Jun 21 23:24:10 backup2 kernel: sd 6:0:0:0: [sdb] Unhandled error code > Jun 21 23:24:10 backup2 kernel: sd 6:0:0:0: [sdb] Result: hostbyte=DID_ABORT driverbyte=DRIVER_OK > Jun 21 23:24:10 backup2 kernel: end_request: I/O error, dev sdb, sector 12887056410 > Jun 21 23:24:10 backup2 kernel: I/O error in filesystem ("sdb1") meta-data dev sdb1 block 0x30020dff8?????? ("xfs_trans_read_buf") error 5 buf count 4096 > Jun 21 23:24:10 backup2 kernel: xfs_force_shutdown(sdb1,0x1) called from line 414 of file fs/xfs/xfs_trans_buf.c.? Return address = 0xffffffffa0168eaf > Jun 21 23:24:10 backup2 kernel: xfs_force_shutdown(sdb1,0x2) called from line 811 of file fs/xfs/xfs_log.c.? Return address = 0xffffffffa015c35f > Jun 21 23:24:10 backup2 kernel: Filesystem "sdb1": I/O Error Detected.? Shutting down filesystem: sdb1 > Jun 21 23:24:10 backup2 kernel: Please umount the filesystem, and rectify the problem(s) > Jun 21 23:24:20 backup2 kernel: Filesystem "sdb1": xfs_log_force: error 5 returned. > Jun 21 23:24:50 backup2 kernel: Filesystem "sdb1": xfs_log_force: error 5 returned. > Jun 21 23:25:20 backup2 kernel: Filesystem "sdb1": xfs_log_force: error 5 returned. From mw@dermichi.com Tue Jun 22 10:27:22 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5MFRLLL243421 for ; Tue, 22 Jun 2010 10:27:22 -0500 X-ASG-Debug-ID: 1277220853-531701f10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from firestarter.dermichi.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3E02C15A07E8 for ; Tue, 22 Jun 2010 08:34:13 -0700 (PDT) Received: from firestarter.dermichi.com (firestarter.dermichi.com [78.41.115.230]) by cuda.sgi.com with ESMTP id mlzrTbMwSzdVBlsW for ; Tue, 22 Jun 2010 08:34:13 -0700 (PDT) Received: from cl-840.mbx-01.si.sixxs.net ([2001:15c0:65ff:347::2]) by firestarter.dermichi.com with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.72) (envelope-from ) id 1OR5QF-0002O1-N4 for xfs@oss.sgi.com; Tue, 22 Jun 2010 17:29:59 +0200 Message-ID: <4C20D6F6.5020208@dermichi.com> Date: Tue, 22 Jun 2010 17:29:58 +0200 From: Michael Weissenbacher User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100423 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: advice for repair after IO error on raid device Subject: Re: advice for repair after IO error on raid device References: In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: firestarter.dermichi.com[78.41.115.230] X-Barracuda-Start-Time: 1277220854 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0109 1.0000 -1.9502 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.95 X-Barracuda-Spam-Status: No, SCORE=-1.95 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33241 Rule breakdown below pts rule 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 Roel! > Trying to answer my own question. I _think_ this is the way to go: > > 1) Mount and unmount the fs, in order to replay the log. > 2) Run xfs_repair -n > 3) Run xfs_repair > > If someone could confirm (or reject) that, that would be great. This is a sound plan, i always do a "xfs_repair -n" first. If you're lucky it will find no problems and you can skip step 3). If "xfs_repair -n" does find problems you can ask for more advice here. good luck, Michael From michael.monnerie@is.it-management.at Tue Jun 22 11:04:42 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5MG4f7s244572 for ; Tue, 22 Jun 2010 11:04:42 -0500 X-ASG-Debug-ID: 1277222841-6b0503790000-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 36AE63F80F1 for ; Tue, 22 Jun 2010 09:07:21 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id hCZEorzFawLcTsDY for ; Tue, 22 Jun 2010 09:07:21 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 037CD17D for ; Tue, 22 Jun 2010 18:07:19 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id B775A83C828 for ; Tue, 22 Jun 2010 18:06:58 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: advice for repair after IO error on raid device Subject: Re: advice for repair after IO error on raid device Date: Tue, 22 Jun 2010 18:07:18 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) References: In-Reply-To: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart30416575.0clGQv9Z8g"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201006221807.19191@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1277222842 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0040 1.0000 -1.9951 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.00 X-Barracuda-Spam-Status: No, SCORE=-2.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33244 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart30416575.0clGQv9Z8g Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Dienstag, 22. Juni 2010 Roel van Meer wrote: > Jun 21 23:23:59 backup2 kernel: arcmsr6: abort device command of scsi > id =3D 0 lun =3D 0 Jun 21 23:24:10 backup2 kernel: arcmsr6: ccb > =3D'0xffff8800cb88ad40'????????????????????????????? isr got aborted This does not sound like a simple failed disk. We also use Areca RAID=20 controllers, they are great, and a failed disk does *never* influence=20 the running system - that's what you have the RAID controller for, after=20 all. You only receive an e-mail from the controller about the disabled=20 disk. The "isr got aborted" sounds like a driver problem, please report that=20 log snipped to areca support so they can help you (I'd be interested in=20 the results too - please tell me per PM once you know). The address is support@areca.com.tw, and they tend to answer quickly and good. =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/ --nextPart30416575.0clGQv9Z8g 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) iEYEABECAAYFAkwg37cACgkQzhSR9xwSCbTFrwCg1azEZLuzkhEXZ5cDImApenaJ WswAn2yFageL7Hh6SK+mGkLXE/H/T3QS =SCPJ -----END PGP SIGNATURE----- --nextPart30416575.0clGQv9Z8g-- From eflorac@intellique.com Tue Jun 22 11:29: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 o5MGTEfA245888 for ; Tue, 22 Jun 2010 11:29:14 -0500 X-ASG-Debug-ID: 1277224562-106801740000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2C94315A080A for ; Tue, 22 Jun 2010 09:36:04 -0700 (PDT) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id c1NgOfD6IoeGcHOW for ; Tue, 22 Jun 2010 09:36:04 -0700 (PDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id D36DA4C8034; Tue, 22 Jun 2010 18:31:46 +0200 (CEST) Date: Tue, 22 Jun 2010 18:31:54 +0200 From: Emmanuel Florac To: Roel van Meer Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: advice for repair after IO error on raid device Subject: Re: advice for repair after IO error on raid device Message-ID: <20100622183154.24e84e0d@harpe.intellique.com> In-Reply-To: References: Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1277224566 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33247 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Tue, 22 Jun 2010 16:53:32 +0200 Roel van Meer =E9crivait: > If someone could confirm (or reject) that, that would be great. Confirmation granted. > (By the way, is it necessary to run xfs_repair with -n first? If not, > are there advantages that would justify the extra time it takes?) It will indicate what modifications he would have done, before actually doing them... Like "inode 038953095 corrupted, would remove it" then "directory not connected, would move content moved to lost+found" I found that usually xfs_repair is quit quick and never takes much more than a couple of minutes (even on very big arrays) so you have no valid reason to skip the "xfs_repair -n" part. It may be nice to dump the filesystem metadata with xfs_metadump prior to using xfs_repair too. In the case where the repair's really gone bad, you could at least revert to the prior less broken state using xfs_mdrestore... --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From eflorac@intellique.com Tue Jun 22 11:33:39 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5MGXddg246040 for ; Tue, 22 Jun 2010 11:33:39 -0500 X-ASG-Debug-ID: 1277224827-11c901e50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5B0C815A08CF for ; Tue, 22 Jun 2010 09:40:29 -0700 (PDT) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id q9fNyOazlhG2ojhK for ; Tue, 22 Jun 2010 09:40:29 -0700 (PDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id 52F0E4C8177; Tue, 22 Jun 2010 18:36:12 +0200 (CEST) Date: Tue, 22 Jun 2010 18:35:58 +0200 From: Emmanuel Florac To: Michael Monnerie Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: advice for repair after IO error on raid device Subject: Re: advice for repair after IO error on raid device Message-ID: <20100622183558.537ae596@harpe.intellique.com> In-Reply-To: <201006221807.19191@zmi.at> References: <201006221807.19191@zmi.at> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/signed; micalg=PGP-SHA1; boundary="Sig_/ZOw0iRExni2w_Oc/dBNby8U"; protocol="application/pgp-signature" X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1277224832 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33247 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --Sig_/ZOw0iRExni2w_Oc/dBNby8U Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Le Tue, 22 Jun 2010 18:07:18 +0200 Michael Monnerie =E9crivait: > The "isr got aborted" sounds like a driver problem You bet, isr stands for "interrupt system routine", apparently the driver (or the firmware) seriously shat its pants. Maybe a firmware and/or kernel upgrade would be good too. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ --Sig_/ZOw0iRExni2w_Oc/dBNby8U Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux) iEYEARECAAYFAkwg5m4ACgkQX3jQXNUicVbvPQCgvZHEDmCeeTzgr1E8psqeHXna Z+IAoMh3Ip+GmzgbXxdOBNjKks1QSe/N =QSaf -----END PGP SIGNATURE----- --Sig_/ZOw0iRExni2w_Oc/dBNby8U-- From klonatos@ics.forth.gr Wed Jun 23 02:35:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5N7ZBo4013797 for ; Wed, 23 Jun 2010 02:35:11 -0500 X-ASG-Debug-ID: 1277278671-63cf01710000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailgate.ics.forth.gr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 955B53FA98D for ; Wed, 23 Jun 2010 00:37:51 -0700 (PDT) Received: from mailgate.ics.forth.gr (mailgate.ics.forth.gr [139.91.1.2]) by cuda.sgi.com with ESMTP id jgzRxlOkUUXXl43z for ; Wed, 23 Jun 2010 00:37:51 -0700 (PDT) Received: from av1.ics.forth.gr (av1-in.ics.forth.gr [139.91.1.71]) by mailgate.ics.forth.gr (8.14.3/ICS-FORTH/V10-1.8-GATE) with ESMTP id o5N7bl7L027250 for ; Wed, 23 Jun 2010 10:37:50 +0300 (EEST) X-AuditID: 8b5b9d47-b7bd0ae000003df0-1a-4c21b9cb5733 Received: from enigma.ics.forth.gr (webmail.ics.forth.gr [139.91.1.30]) by av1.ics.forth.gr (SMTP Outbound / FORTH / ICS) with SMTP id C5.BD.15856.BC9B12C4; Wed, 23 Jun 2010 10:37:47 +0300 (EEST) Received: from [139.91.92.13] ([139.91.92.13]) (authenticated bits=0) by enigma.ics.forth.gr (8.14.3//ICS-FORTH/V10.3.0C-EXTNULL-SSL-SASL) with ESMTP id o5N7blIa023547 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 23 Jun 2010 10:37:47 +0300 Message-ID: <4C21B9AF.9010307@ics.forth.gr> Date: Wed, 23 Jun 2010 10:37:19 +0300 From: Yannis Klonatos User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.10) Gecko/20100512 Thunderbird/3.0.5 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: XFS peculiar behavior Subject: XFS peculiar behavior Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Brightmail-Tracker: AAAAAA== X-j-chkmail-Score: MSGID : 4C21B9CC.000 on mailgate : j-chkmail score : . : R=. U=. O=. B=0.000 -> S=0.000 X-ICS-JCHK-SCL: Ham X-Barracuda-Connect: mailgate.ics.forth.gr[139.91.1.2] X-Barracuda-Start-Time: 1277278672 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0004 1.0000 -2.0187 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33306 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi all! I have come across the following peculiar behavior in XFS and i would appreciate any information anyone could provide. In our lab we have a system that has twelve 500GByte hard disks (total capacity 6TByte), connected to an Areca (ARC-1680D-IX-12) SAS storage controller. The disks are configured as a RAID-0 device. Then I create a clean XFS filesystem on top of the raid volume, using the whole capacity. We use this test-setup to measure performance improvement for a TPC-H experiment. We copy the database over the clean XFS filesystem using the cp utility. The database used in our experiments is 56GBytes in size (data + indices). The problem is that i have noticed that XFS may - not all times - split a table over a large disk distance. For example in one run i have noticed that a file of 13GByte is split over a 4,7TByte distance (I calculate this distance by subtracting the final block used for the file with the first one. The two disk blocks values are acquired using the FIBMAP ioctl). Is there some reasoning behind this (peculiar) behavior? I would expect that since the underlying storage is so large, and the dataset is so small, XFS would try to minimize disk seeks and thus place the file sequentially in disk. Furthermore, I understand that there may be some blocks left unused by XFS between subsequent file blocks used in order to handle any write appends that may come afterward. But i wouldn't expect such a large splitting of a single file. Any help? Thanks in advance, Yannis Klonatos From michael.monnerie@is.it-management.at Wed Jun 23 05:13: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_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 o5NADesW018807 for ; Wed, 23 Jun 2010 05:13:40 -0500 X-ASG-Debug-ID: 1277288436-018e00ae0000-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 0A07114AE620 for ; Wed, 23 Jun 2010 03:20:36 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id nAFXF54qEU2CXcRF for ; Wed, 23 Jun 2010 03:20:36 -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 3756D17E for ; Wed, 23 Jun 2010 12:16:19 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id E53A083C828 for ; Wed, 23 Jun 2010 12:15:56 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS peculiar behavior Subject: Re: XFS peculiar behavior Date: Wed, 23 Jun 2010 12:16:18 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) References: <4C21B9AF.9010307@ics.forth.gr> In-Reply-To: <4C21B9AF.9010307@ics.forth.gr> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart2530792.x7bXYLASVb"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201006231216.18514@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1277288437 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0385 1.0000 -1.7727 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.77 X-Barracuda-Spam-Status: No, SCORE=-1.77 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33317 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart2530792.x7bXYLASVb Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Mittwoch, 23. Juni 2010 Yannis Klonatos wrote: > The problem is that i have noticed that XFS may - not all times=20 > - split a table over a large disk distance. =20 Interesting. I have no idea why this happens and would be interested in=20 investigation too. As a quick help, maybe using allocsize=3D1G in the xfs mount options would= =20 help? How many AGs does the filesystem have?=20 And which version of mkfs.xfs do you use? Newer xfsprogs create the disk with 4 AGs per default, maybe that=20 influences the allocation order? =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/ --nextPart2530792.x7bXYLASVb 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) iEYEABECAAYFAkwh3vIACgkQzhSR9xwSCbRWOQCcCcwPVMcTPkN6Jf8QIO8qL9bp 7K4AnijlonxfWFryde24uKG6WXtPzpWJ =Q0eC -----END PGP SIGNATURE----- --nextPart2530792.x7bXYLASVb-- From andi@firstfloor.org Wed Jun 23 05:21: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 (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5NALqj0019189 for ; Wed, 23 Jun 2010 05:21:54 -0500 X-ASG-Debug-ID: 1277288926-01ae00c00000-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 AA78214AE670 for ; Wed, 23 Jun 2010 03:28:47 -0700 (PDT) Received: from one.firstfloor.org (one.firstfloor.org [213.235.205.2]) by cuda.sgi.com with ESMTP id KINHPGOSIWM65yr0 for ; Wed, 23 Jun 2010 03:28:47 -0700 (PDT) Received: from basil.firstfloor.org (p5B3CB499.dip0.t-ipconnect.de [91.60.180.153]) by one.firstfloor.org (Postfix) with ESMTP id 434F51A980C3; Wed, 23 Jun 2010 12:24:28 +0200 (CEST) Received: by basil.firstfloor.org (Postfix, from userid 1000) id 4CDAEB1F52; Wed, 23 Jun 2010 12:24:27 +0200 (CEST) From: Andi Kleen To: Yannis Klonatos Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS peculiar behavior Subject: Re: XFS peculiar behavior References: <4C21B9AF.9010307@ics.forth.gr> Date: Wed, 23 Jun 2010 12:24:27 +0200 In-Reply-To: <4C21B9AF.9010307@ics.forth.gr> (Yannis Klonatos's message of "Wed, 23 Jun 2010 10:37:19 +0300") Message-ID: <87bpb2avxg.fsf@basil.nowhere.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: one.firstfloor.org[213.235.205.2] X-Barracuda-Start-Time: 1277288927 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0169 1.0000 -1.9110 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.91 X-Barracuda-Spam-Status: No, SCORE=-1.91 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33317 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Yannis Klonatos writes: > The problem is that i have noticed that XFS may - not all Why is that a problem? > times - split a table over a large disk distance. For > example in one run i have noticed that a file of 13GByte is split over > a 4,7TByte distance (I calculate this distance > by subtracting the final block used for the file with the first > one. The two disk blocks values are acquired using the > FIBMAP ioctl). I don't know if it's the only reason, but XFS does a lot of data structure locking and updates per allocation group, so spreading to multiple AGs gives better scalability to many CPUs. Also I suppose it's good to avoid hot spots on the underlying device. -Andi -- ak@linux.intel.com -- Speaking for myself only. From michael.monnerie@is.it-management.at Wed Jun 23 10:02:17 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5NF2HTT028277 for ; Wed, 23 Jun 2010 10:02:17 -0500 X-ASG-Debug-ID: 1277305754-0c0200ad0000-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 1841515A283A for ; Wed, 23 Jun 2010 08:09:14 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id zHORR1eQNQKmIqLM for ; Wed, 23 Jun 2010 08:09:14 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 3859917E for ; Wed, 23 Jun 2010 17:04:56 +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 5FA7183C828 for ; Wed, 23 Jun 2010 17:04:33 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS peculiar behavior Subject: Re: XFS peculiar behavior Date: Wed, 23 Jun 2010 17:04:55 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) References: <4C21B9AF.9010307@ics.forth.gr> <87bpb2avxg.fsf@basil.nowhere.org> In-Reply-To: <87bpb2avxg.fsf@basil.nowhere.org> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart58065848.Qv27cxW9nv"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201006231704.55273@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1277305755 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0188 1.0000 -1.8987 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.90 X-Barracuda-Spam-Status: No, SCORE=-1.90 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33337 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart58065848.Qv27cxW9nv Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Mittwoch, 23. Juni 2010 Andi Kleen wrote: > I don't know if it's the only reason, but XFS does a lot of data > structure locking and updates per allocation group, so spreading > to multiple AGs gives better scalability to many CPUs. This only helps if there are metadata operations, right? So in the case=20 where you have one big database "file" of 50GB, it should be ordered=20 sector-by-sector to get the maximum performance, and minimize disk-head=20 movement. And I don't believe XFS would scatter a single big file around several=20 AGs, as far as I know even all files within the same dir are grouped=20 within a single AG. The AG "scattering" is done for separate dirs only. =20 > Also I suppose it's good to avoid hot spots on the underlying=20 > device. A database file is staying on the same place "forever" and will be=20 overwritten all the time, so it doesn't matter for the "hot spot" case. =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/ --nextPart58065848.Qv27cxW9nv 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) iEYEABECAAYFAkwiIpcACgkQzhSR9xwSCbT1OwCcC5gjq/PQFCfsUTTTwUEDqn20 fGwAoOjEw63yGcXpOiiaHoZbE6lC0k9R =Qi2/ -----END PGP SIGNATURE----- --nextPart58065848.Qv27cxW9nv-- From sandeen@sandeen.net Wed Jun 23 11:19:05 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5NGJ5nx031157 for ; Wed, 23 Jun 2010 11:19:05 -0500 X-ASG-Debug-ID: 1277310106-5bbe01e70000-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 340FB152DC16 for ; Wed, 23 Jun 2010 09:21:46 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id ZPFkqxaLTzRAvvxN for ; Wed, 23 Jun 2010 09:21:46 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id D327E4968913; Wed, 23 Jun 2010 11:21:45 -0500 (CDT) Message-ID: <4C223499.4050502@sandeen.net> Date: Wed, 23 Jun 2010 11:21:45 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: Yannis Klonatos CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS peculiar behavior Subject: Re: XFS peculiar behavior References: <4C21B9AF.9010307@ics.forth.gr> In-Reply-To: <4C21B9AF.9010307@ics.forth.gr> 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: 1277310107 X-Barracuda-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.33342 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 Yannis Klonatos wrote: > Hi all! > > I have come across the following peculiar behavior in XFS and i > would appreciate any information anyone > could provide. > In our lab we have a system that has twelve 500GByte hard disks > (total capacity 6TByte), connected to an > Areca (ARC-1680D-IX-12) SAS storage controller. The disks are configured > as a RAID-0 device. Then I create > a clean XFS filesystem on top of the raid volume, using the whole > capacity. We use this test-setup to measure > performance improvement for a TPC-H experiment. We copy the database > over the clean XFS filesystem using the > cp utility. The database used in our experiments is 56GBytes in size > (data + indices). > The problem is that i have noticed that XFS may - not all times > - split a table over a large disk distance. For > example in one run i have noticed that a file of 13GByte is split over a > 4,7TByte distance (I calculate this distance > by subtracting the final block used for the file with the first one. The > two disk blocks values are acquired using the > FIBMAP ioctl). xfs_bmap output would be a lot nicer. Maybe you can paste that here to show exactly what the layout is. -Eric > Is there some reasoning behind this (peculiar) behavior? I would > expect that since the underlying storage is so > large, and the dataset is so small, XFS would try to minimize disk seeks > and thus place the file sequentially in disk. > Furthermore, I understand that there may be some blocks left unused by > XFS between subsequent file blocks used > in order to handle any write appends that may come afterward. But i > wouldn't expect such a large splitting of a single > file. > Any help? > > Thanks in advance, > Yannis Klonatos From michael.monnerie@is.it-management.at Wed Jun 23 13:30: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 (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5NIUD3n035197 for ; Wed, 23 Jun 2010 13:30:14 -0500 X-ASG-Debug-ID: 1277317973-6e4f01390000-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 6F3F3152E608 for ; Wed, 23 Jun 2010 11:32:53 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id FXEFAO2QL8y28Fbq for ; Wed, 23 Jun 2010 11:32:53 -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 2037F17E; Wed, 23 Jun 2010 20:32:52 +0200 (CEST) Received: from saturn.localnet (saturn.i.zmi.at [10.72.27.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mailsrv.i.zmi.at (Postfix) with ESMTPSA id EF8A483C828; Wed, 23 Jun 2010 20:32:28 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com, Eric Sandeen X-ASG-Orig-Subj: Re: xfs_repair 3.1.2 crashing Subject: Re: xfs_repair 3.1.2 crashing Date: Wed, 23 Jun 2010 20:32:46 +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> <4C12E520.6040008@sandeen.net> <201006121241.52336@zmi.at> In-Reply-To: <201006121241.52336@zmi.at> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart4180749.6qIoClEGSH"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201006232032.51016@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1277317974 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33349 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart4180749.6qIoClEGSH Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable On Samstag, 12. Juni 2010 Michael Monnerie wrote: > openSUSE 11.2 with it's latest kernel, 2.6.31.12-0.2-desktop Any news here? I'd need a fix, is there a chance to get back the contents o= f this file? [212428.619676] Filesystem "dm-0": corrupt inode 2267035928 ((a)extents =3D= 7). Unmount and run xfs_repair. = = =20 [212428.619681] ffff8800f3a9a800: 49 4e 81 fc 02 02 00 00 00 00 04 e5 00 00= 00 64 IN.............d = = =20 [212428.619686] 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 [212428.619688] [212428.619691] Pid: 13006, comm: ls Not tainted 2.6.31.12-0.2-xen #1 [212428.619694] Call Trace: [212428.619707] [] try_stack_unwind+0x189/0x1b0 [212428.619714] [] dump_trace+0xa6/0x1e0 [212428.619718] [] show_trace_log_lvl+0x64/0x90 [212428.619722] [] show_trace+0x23/0x40 [212428.619727] [] dump_stack+0x81/0x9e [212428.619761] [] xfs_error_report+0x5a/0x70 [xfs] [212428.619810] [] xfs_corruption_error+0x6c/0x90 [xfs] [212428.619853] [] xfs_iformat_extents+0x234/0x280 [xfs] [212428.619903] [] xfs_iformat+0x28d/0x5a0 [xfs] [212428.619951] [] xfs_iread+0x182/0x1c0 [xfs] [212428.620000] [] xfs_iget_cache_miss+0x78/0x200 [xfs] [212428.620046] [] xfs_iget+0x129/0x1d0 [xfs] [212428.620094] [] xfs_lookup+0xce/0x100 [xfs] [212428.620158] [] xfs_vn_lookup+0x6c/0xc0 [xfs] [212428.620220] [] real_lookup+0x102/0x180 [212428.620225] [] do_lookup+0xd0/0x100 [212428.620229] [] __link_path_walk+0x7f8/0xf40 [212428.620233] [] path_walk+0x66/0xd0 [212428.620237] [] do_path_lookup+0x6b/0xb0 [212428.620240] [] user_path_at+0x61/0xc0 [212428.620244] [] vfs_fstatat+0x41/0x90 [212428.620248] [] vfs_lstat+0x2c/0x50 [212428.620251] [] sys_newlstat+0x2e/0x70 [212428.620254] [] system_call_fastpath+0x16/0x1b [212428.620263] [<00007fcb58264e65>] 0x7fcb58264e65 =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/ --nextPart4180749.6qIoClEGSH 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) iEYEABECAAYFAkwiU1IACgkQzhSR9xwSCbRwVACeNLi96zjHR8F82fmeWN5fykOi LIcAoMlZsaVB/awpejS9hjQ1b9P7XrtE =99i8 -----END PGP SIGNATURE----- --nextPart4180749.6qIoClEGSH-- From greg@kroah.com Wed Jun 23 15:35: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.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 o5NKZMBm038549 for ; Wed, 23 Jun 2010 15:35:22 -0500 X-ASG-Debug-ID: 1277325483-579f037d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from coco.kroah.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 388C83FD563 for ; Wed, 23 Jun 2010 13:38:03 -0700 (PDT) Received: from coco.kroah.org (kroah.org [198.145.64.141]) by cuda.sgi.com with ESMTP id XlA8TvU7XVy8q4Fj for ; Wed, 23 Jun 2010 13:38:03 -0700 (PDT) Received: from localhost (c-24-16-163-131.hsd1.wa.comcast.net [24.16.163.131]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by coco.kroah.org (Postfix) with ESMTPSA id A200848A3F; Wed, 23 Jun 2010 13:38:02 -0700 (PDT) Date: Wed, 23 Jun 2010 13:36:53 -0700 From: Greg KH To: Dave Chinner Cc: Andrew Morton , linux-fsdevel@vger.kernel.org, stable@kernel.org, torvalds@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [stable] [PATCH 1/3] writeback: pay attention to wbc->nr_to_write in write_cache_pages Subject: Re: [stable] [PATCH 1/3] writeback: pay attention to wbc->nr_to_write in write_cache_pages Message-ID: <20100623203653.GB2281@kroah.com> 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> <20100610000811.GL7869@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100610000811.GL7869@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: kroah.org[198.145.64.141] X-Barracuda-Start-Time: 1277325484 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33357 Rule breakdown below pts rule 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 10:08:11AM +1000, Dave Chinner wrote: > 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... Ok, can someone please tell me the git commit ids that need to be applied to the -stable trees? thanks, greg k-h From SRS0+sD/0+23+fromorbit.com=david@internode.on.net Wed Jun 23 18:14: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 o5NNENgP044595 for ; Wed, 23 Jun 2010 18:14:23 -0500 X-ASG-Debug-ID: 1277335282-6eb701df0000-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 EEF53B5F908 for ; Wed, 23 Jun 2010 16:21:22 -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 kaMPlA2mlL8K2XMj for ; Wed, 23 Jun 2010 16:21:22 -0700 (PDT) Received: from dastard (unverified [121.44.96.63]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 28852130-1927428 for multiple; Thu, 24 Jun 2010 08:47:02 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1ORZBk-0007CW-Sj; Thu, 24 Jun 2010 09:17:00 +1000 Date: Thu, 24 Jun 2010 09:17:00 +1000 From: Dave Chinner To: Yannis Klonatos Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS peculiar behavior Subject: Re: XFS peculiar behavior Message-ID: <20100623231700.GP6590@dastard> References: <4C21B9AF.9010307@ics.forth.gr> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C21B9AF.9010307@ics.forth.gr> 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: 1277335283 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33368 Rule breakdown below pts rule 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 23, 2010 at 10:37:19AM +0300, Yannis Klonatos wrote: > Hi all! > > I have come across the following peculiar behavior in XFS > and i would appreciate any information anyone > could provide. > In our lab we have a system that has twelve 500GByte hard > disks (total capacity 6TByte), connected to an > Areca (ARC-1680D-IX-12) SAS storage controller. The disks are > configured as a RAID-0 device. Then I create > a clean XFS filesystem on top of the raid volume, using the whole > capacity. We use this test-setup to measure > performance improvement for a TPC-H experiment. We copy the database > over the clean XFS filesystem using the > cp utility. The database used in our experiments is 56GBytes in size > (data + indices). > The problem is that i have noticed that XFS may - not all > times - split a table over a large disk distance. For > example in one run i have noticed that a file of 13GByte is split > over a 4,7TByte distance (I calculate this distance > by subtracting the final block used for the file with the first one. > The two disk blocks values are acquired using the > FIBMAP ioctl). > Is there some reasoning behind this (peculiar) behavior? I > would expect that since the underlying storage is so > large, and the dataset is so small, XFS would try to minimize disk > seeks and thus place the file sequentially in disk. > Furthermore, I understand that there may be some blocks left unused > by XFS between subsequent file blocks used > in order to handle any write appends that may come afterward. But i > wouldn't expect such a large splitting of a single > file. > Any help? The reasons for it being split are wide and varied. We need more information before trying to determie the reason. The output of "xfs_info " will tell us your filesystem geometry and the output of xfs_bmap will tell us exactly how it was laid out on disk. These are needed to see exactly what the problem is. Did you copy the file alone, with others, or while there were other write operations going on in the background? was it a pristine filesystem that you copied it to? If so, what was the directory structure created before/by the copy? Also, the kernel version you are running, and the version of xfsprogs you have installed (xfs_info -V) will help us determine if you are tripping any known bugs... Cheers, Dave. -- Dave Chinner david@fromorbit.com From rolek@bokxing.nl Thu Jun 24 03:26:01 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5O8Q1Vt075539 for ; Thu, 24 Jun 2010 03:26:01 -0500 X-ASG-Debug-ID: 1277368122-56e601a20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bork.lsof.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 75A171A87D06 for ; Thu, 24 Jun 2010 01:28:42 -0700 (PDT) Received: from bork.lsof.org (bork.lsof.org [87.253.148.42]) by cuda.sgi.com with ESMTP id C9DVeRlLGxmDW0F1 for ; Thu, 24 Jun 2010 01:28:42 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by bork.lsof.org (Postfix) with ESMTP id AEA21BBC7 for ; Thu, 24 Jun 2010 10:28:41 +0200 (CEST) Received: from bork.lsof.org ([127.0.0.1]) by localhost (bork.lsof.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id qIFOXtN6uTVN for ; Thu, 24 Jun 2010 10:28:39 +0200 (CEST) Received: from bork.lsof.org (localhost [127.0.0.1]) by bork.lsof.org (Postfix) with ESMTP id B748ABBC6 for ; Thu, 24 Jun 2010 10:28:39 +0200 (CEST) References: <201006221807.19191@zmi.at> Message-ID: X-Mailer: http://www.courier-mta.org/cone/ From: Roel van Meer To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: advice for repair after IO error on raid device [SOLVED] Subject: Re: advice for repair after IO error on raid device [SOLVED] Date: Thu, 24 Jun 2010 10:28:39 +0200 Mime-Version: 1.0 Content-Type: text/plain; format=flowed; charset="US-ASCII" Content-Disposition: inline Content-Transfer-Encoding: 7bit X-Barracuda-Connect: bork.lsof.org[87.253.148.42] X-Barracuda-Start-Time: 1277368123 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.33404 Rule breakdown below pts rule 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 list, just a quick follow-up: xfs_repair didn't find any trouble and everything is up and running again like a charm. Always nice to be able to post good news. Thanks for your help and thanks for the great FS! Regards, roel From sws@stud.pam.szczecin.pl Thu Jun 24 03:59:27 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5O8xRWk094463 for ; Thu, 24 Jun 2010 03:59:27 -0500 X-ASG-Debug-ID: 1277370128-4d4b02c30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from stud.pam.szczecin.pl (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0812D1E14690 for ; Thu, 24 Jun 2010 02:02:08 -0700 (PDT) Received: from stud.pam.szczecin.pl (stud.pam.szczecin.pl [212.14.5.154]) by cuda.sgi.com with ESMTP id b5Eb4AllLTGuELbb for ; Thu, 24 Jun 2010 02:02:08 -0700 (PDT) Received: from sws (helo=localhost) by stud.pam.szczecin.pl with local-esmtp (Exim 4.63) (envelope-from ) id 1ORiJu-0003IC-KE for xfs@oss.sgi.com; Thu, 24 Jun 2010 11:02:02 +0200 Date: Thu, 24 Jun 2010 11:02:02 +0200 (CEST) From: Stanczak Slawomir To: xfs@oss.sgi.com X-ASG-Orig-Subj: xfs_quota report problem Subject: xfs_quota report problem Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Barracuda-Connect: stud.pam.szczecin.pl[212.14.5.154] X-Barracuda-Start-Time: 1277370129 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33406 Rule breakdown below pts rule 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 use xfs on my Debian Linux system. I have one question. How can I display users with exceeded soft blocks limit only? I can do: xfs_quota -x -c report /home | grep day xfs_quota -x -c report /home | grep day | awk '{print $1}' but the solution isn't a good idea. Have you any other idea? Thanks for your help Best regards Slawomir Stanczak From klonatos@ics.forth.gr Thu Jun 24 09:17:23 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_83 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 o5OEHMxm115772 for ; Thu, 24 Jun 2010 09:17:23 -0500 X-ASG-Debug-ID: 1277389189-798f02b40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailgate.ics.forth.gr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 69DC74001E7 for ; Thu, 24 Jun 2010 07:19:49 -0700 (PDT) Received: from mailgate.ics.forth.gr (mailgate.ics.forth.gr [139.91.1.2]) by cuda.sgi.com with ESMTP id ovhzO8hxAvWK1J7A for ; Thu, 24 Jun 2010 07:19:49 -0700 (PDT) Received: from av1.ics.forth.gr (av1-in.ics.forth.gr [139.91.1.71]) by mailgate.ics.forth.gr (8.14.3/ICS-FORTH/V10-1.8-GATE) with ESMTP id o5OEBwkm015532; Thu, 24 Jun 2010 17:12:00 +0300 (EEST) X-AuditID: 8b5b9d47-b7bd0ae000003df0-4f-4c2367ae8681 Received: from enigma.ics.forth.gr (webmail.ics.forth.gr [139.91.1.30]) by av1.ics.forth.gr (SMTP Outbound / FORTH / ICS) with SMTP id 10.73.15856.EA7632C4; Thu, 24 Jun 2010 17:11:58 +0300 (EEST) Received: from [139.91.92.13] ([139.91.92.13]) (authenticated bits=0) by enigma.ics.forth.gr (8.14.3//ICS-FORTH/V10.3.0C-EXTNULL-SSL-SASL) with ESMTP id o5OEDekY020203 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 24 Jun 2010 17:13:41 +0300 Message-ID: <4C236791.1030709@ics.forth.gr> Date: Thu, 24 Jun 2010 17:11:29 +0300 From: Yannis Klonatos User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.10) Gecko/20100512 Thunderbird/3.0.5 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com, sandeen@sandeen.net, andi@firstfloor.org X-ASG-Orig-Subj: Re: XFS peculiar behavior Subject: Re: XFS peculiar behavior References: <4C21B9AF.9010307@ics.forth.gr> <20100623231700.GP6590@dastard> In-Reply-To: <20100623231700.GP6590@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Brightmail-Tracker: AAAAAA== X-j-chkmail-Score: MSGID : 4C2367AE.000 on mailgate : j-chkmail score : . : R=. U=. O=. B=0.000 -> S=0.000 X-ICS-JCHK-SCL: Ham X-Barracuda-Connect: mailgate.ics.forth.gr[139.91.1.2] X-Barracuda-Start-Time: 1277389190 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33428 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hello again, First of all, thank you all for your quick replies. I attach all the information you requested in your responses. 1) The output of xfs_info is the following: meta-data=/dev/sdf isize=256 agcount=32, agsize=45776328 blks = sectsz=512 attr=0 data = bsize=4096 blocks=1464842496, imaxpct=25 = sunit=0 swidth=0 blks, unwritten=1 naming =version 2 bsize=4096 log =internal bsize=4096 blocks=32768, version=1 = ectsz=512 sunit=0 blks, lazy-count=0 realtime =none extsz=4096 blocks=0, rtextents=0 2) The output of xfs_bmap in the lineitem.MYI table of the TPC-H workload is at one run: /mnt/test/mysql/tpch/lineitem.MYI: EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL 0: [0..6344271]: 11352529416..11358873687 31 (72..6344343) 6344272 1: [6344272..10901343]: 1464842608..1469399679 4 (112..4557183) 4557072 2: [10901344..18439199]: 1831053200..1838591055 5 (80..7537935) 7537856 3: [18439200..25311519]: 2197263840..2204136159 6 (96..6872415) 6872320 4: [25311520..26660095]: 2563474464..2564823039 7 (96..1348671) 1348576 Given that all disk blocks are in units of 512-byte blocks, if I interpret the output correctly the first file is at block 1465352792 = 698.4GByte offset and the last block is at 5421.1GByte offset, meaning that this specific table is split over a 4,7TByte distance. However, in another run (with a clean file system again) /mnt/test/mysql/tpch/lineitem.MYI: EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL 0: [0..26660095]: 11352529416..11379189511 31 (72..26660167) 26660096 3) For the copy, as i mentioned in my previous mail, i copied the database over nfs using the cp -R linux program. Thus, i believe all the files are copied sequentially, the one after the other, with no other concurrent write operations running at the background. The file-system was pristine before the cp with no files, and just the mount directory was created (all the other necessary files and directories are created from the cp program). 4) The version of xfsprogs is 2.9.4 (acquired with xfs_info -v) and the version of the kernel is 2.6.18-164.11.1.el5. If you require any further information let me know. Let me state that i can also provide you with the complete data-set if you feel it necessary trying to reproduce the issue. Thanks, Yannis Klonatos >> Hi all! >> >> I have come across the following peculiar behavior in XFS >> and i would appreciate any information anyone >> could provide. >> In our lab we have a system that has twelve 500GByte hard >> disks (total capacity 6TByte), connected to an >> Areca (ARC-1680D-IX-12) SAS storage controller. The disks are >> configured as a RAID-0 device. Then I create >> a clean XFS filesystem on top of the raid volume, using the whole >> capacity. We use this test-setup to measure >> performance improvement for a TPC-H experiment. We copy the database >> over the clean XFS filesystem using the >> cp utility. The database used in our experiments is 56GBytes in size >> (data + indices). >> The problem is that i have noticed that XFS may - not all >> times - split a table over a large disk distance. For >> example in one run i have noticed that a file of 13GByte is split >> over a 4,7TByte distance (I calculate this distance >> by subtracting the final block used for the file with the first one. >> The two disk blocks values are acquired using the >> FIBMAP ioctl). >> Is there some reasoning behind this (peculiar) behavior? I >> would expect that since the underlying storage is so >> large, and the dataset is so small, XFS would try to minimize disk >> seeks and thus place the file sequentially in disk. >> Furthermore, I understand that there may be some blocks left unused >> by XFS between subsequent file blocks used >> in order to handle any write appends that may come afterward. But i >> wouldn't expect such a large splitting of a single >> file. >> Any help? >> From sandeen@sandeen.net Thu Jun 24 10:19: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.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_83 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 o5OFJB7m177637 for ; Thu, 24 Jun 2010 10:19:11 -0500 X-ASG-Debug-ID: 1277392913-021a00ff0000-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 6A296153ECDB for ; Thu, 24 Jun 2010 08:21:53 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id NeT5Rmdrn44to6wS for ; Thu, 24 Jun 2010 08:21:53 -0700 (PDT) X-ASG-Whitelist: Barracuda Reputation Received: from int-mx05.intmail.prod.int.phx2.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.18]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o5OFLLnA024348 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 24 Jun 2010 11:21:21 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by int-mx05.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o5OFLHeh001646; Thu, 24 Jun 2010 11:21:17 -0400 Message-ID: <4C2377ED.8090300@sandeen.net> Date: Thu, 24 Jun 2010 10:21:17 -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: Yannis Klonatos CC: Dave Chinner , andi@firstfloor.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS peculiar behavior Subject: Re: XFS peculiar behavior References: <4C21B9AF.9010307@ics.forth.gr> <20100623231700.GP6590@dastard> <4C236791.1030709@ics.forth.gr> In-Reply-To: <4C236791.1030709@ics.forth.gr> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.18 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1277392914 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 06/24/2010 09:11 AM, Yannis Klonatos wrote: > Hello again, > > First of all, thank you all for your quick replies. I attach > all the information you requested in your responses. > > 1) The output of xfs_info is the following: > > meta-data=/dev/sdf isize=256 agcount=32, agsize=45776328 blks > = sectsz=512 attr=0 > data = bsize=4096 blocks=1464842496, imaxpct=25 > = sunit=0 swidth=0 blks, unwritten=1 > naming =version 2 bsize=4096 > log =internal bsize=4096 blocks=32768, version=1 > = sectsz=512 sunit=0 blks, lazy-count=0 > realtime =none extsz=4096 blocks=0, rtextents=0 > > 2) The output of xfs_bmap in the lineitem.MYI table of the TPC-H > workload is at one run: > > /mnt/test/mysql/tpch/lineitem.MYI: > EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL > 0: [0..6344271]: 11352529416..11358873687 31 (72..6344343) 6344272 > 1: [6344272..10901343]: 1464842608..1469399679 4 (112..4557183) 4557072 > 2: [10901344..18439199]: 1831053200..1838591055 5 (80..7537935) 7537856 > 3: [18439200..25311519]: 2197263840..2204136159 6 (96..6872415) 6872320 > 4: [25311520..26660095]: 2563474464..2564823039 7 (96..1348671) 1348576 > > Given that all disk blocks are in units of 512-byte blocks, if I > interpret the output > correctly the first file is at block 1465352792 = 698.4GByte offset and > the last block > is at 5421.1GByte offset, meaning that this specific table is split over > a 4,7TByte distance. The file started out in the last AG, and then had to wrap around, because it hit the end of the filesystem. :) It was then somewhat sequential in AGs 4,5,6,7 after that, though not perfectly so. This run was with a clean filesystem? Was the mountpoint /mnt/test? XFS distributes new directories into new AGs (allocation groups, or disk regions) for parallelism, and then files in those dirs start populating the same AG. So if /mnt/test/mysql/tpch ended up in the last AG (#31) then the file likely started there, too. Also, the "inode32" allocator biases data towards the end of the filesystem, because inode numbers in xfs reflect their on-disk location, and to keep inodes numbers below 2^32, it must save space in the lower portions of the filesystem. You might want to re-test with a fresh filesystem mounted with the "inode64" mount option. > However, in another run (with a clean file system again) > > /mnt/test/mysql/tpch/lineitem.MYI: > EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET > TOTAL > 0: [0..26660095]: 11352529416..11379189511 31 (72..26660167) > 26660096 Hmm. > 3) For the copy, as i mentioned in my previous mail, i copied the > database over nfs using the cp -R linux program. > Thus, i believe all the files are copied sequentially, the one after the > other, with no other concurrent write operations > running at the background. The file-system was pristine before the cp > with no files, and just the mount directory was > created (all the other necessary files and directories are created from > the cp program). IIRC, copies over NFS can affect xfs allocator performance, because (IIRC) it tends to close the filehandle periodically and xfs loses the allocator context. We used to have a filehandle cache which held them open, but that went away some time ago. Dave will probably correct significant swaths of this information for me, though ;) > 4) The version of xfsprogs is 2.9.4 (acquired with xfs_info -v) and the > version of the kernel is 2.6.18-164.11.1.el5. Ah! A Red Hat kernel; have you asked your Red Hat support folks for help on this issue? -Eric > If you require any further information let me know. Let me > state that i can also provide you with the complete > data-set if you feel it necessary trying to reproduce the issue. > > Thanks, > Yannis Klonatos >>> Hi all! >>> >>> I have come across the following peculiar behavior in XFS >>> and i would appreciate any information anyone >>> could provide. >>> In our lab we have a system that has twelve 500GByte hard >>> disks (total capacity 6TByte), connected to an >>> Areca (ARC-1680D-IX-12) SAS storage controller. The disks are >>> configured as a RAID-0 device. Then I create >>> a clean XFS filesystem on top of the raid volume, using the whole >>> capacity. We use this test-setup to measure >>> performance improvement for a TPC-H experiment. We copy the database >>> over the clean XFS filesystem using the >>> cp utility. The database used in our experiments is 56GBytes in size >>> (data + indices). >>> The problem is that i have noticed that XFS may - not all >>> times - split a table over a large disk distance. For >>> example in one run i have noticed that a file of 13GByte is split >>> over a 4,7TByte distance (I calculate this distance >>> by subtracting the final block used for the file with the first one. >>> The two disk blocks values are acquired using the >>> FIBMAP ioctl). >>> Is there some reasoning behind this (peculiar) behavior? I >>> would expect that since the underlying storage is so >>> large, and the dataset is so small, XFS would try to minimize disk >>> seeks and thus place the file sequentially in disk. >>> Furthermore, I understand that there may be some blocks left unused >>> by XFS between subsequent file blocks used >>> in order to handle any write appends that may come afterward. But i >>> wouldn't expect such a large splitting of a single >>> file. >>> Any help? >>> > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From klonatos@ics.forth.gr Thu Jun 24 10:41:29 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_83 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 o5OFfSsg206072 for ; Thu, 24 Jun 2010 10:41:29 -0500 X-ASG-Debug-ID: 1277394511-51a201370000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailgate.ics.forth.gr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 538F11119DFF for ; Thu, 24 Jun 2010 08:48:32 -0700 (PDT) Received: from mailgate.ics.forth.gr (mailgate.ics.forth.gr [139.91.1.2]) by cuda.sgi.com with ESMTP id rzPxtba3DmtvLtv4 for ; Thu, 24 Jun 2010 08:48:32 -0700 (PDT) Received: from av1.ics.forth.gr (av1-in.ics.forth.gr [139.91.1.71]) by mailgate.ics.forth.gr (8.14.3/ICS-FORTH/V10-1.8-GATE) with ESMTP id o5OFaPEj020440; Thu, 24 Jun 2010 18:36:27 +0300 (EEST) X-AuditID: 8b5b9d47-b7bd0ae000003df0-67-4c237b784d04 Received: from enigma.ics.forth.gr (webmail.ics.forth.gr [139.91.1.30]) by av1.ics.forth.gr (SMTP Outbound / FORTH / ICS) with SMTP id 1A.C3.15856.87B732C4; Thu, 24 Jun 2010 18:36:24 +0300 (EEST) Received: from [139.91.204.104] ([139.91.204.104]) (authenticated bits=0) by enigma.ics.forth.gr (8.14.3//ICS-FORTH/V10.3.0C-EXTNULL-SSL-SASL) with ESMTP id o5OFc6YC021739 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 24 Jun 2010 18:38:08 +0300 Message-ID: <4C237B4E.8030606@ics.forth.gr> Date: Thu, 24 Jun 2010 18:35:42 +0300 From: Yannis Klonatos User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; el; rv:1.9.1.10) Gecko/20100512 Thunderbird/3.0.5 MIME-Version: 1.0 To: Eric Sandeen CC: Dave Chinner , andi@firstfloor.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS peculiar behavior Subject: Re: XFS peculiar behavior References: <4C21B9AF.9010307@ics.forth.gr> <20100623231700.GP6590@dastard> <4C236791.1030709@ics.forth.gr> <4C2377ED.8090300@sandeen.net> In-Reply-To: <4C2377ED.8090300@sandeen.net> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Brightmail-Tracker: AAAAAA== X-j-chkmail-Score: MSGID : 4C237B79.000 on mailgate : j-chkmail score : . : R=. U=. O=. B=0.000 -> S=0.000 X-ICS-JCHK-SCL: Ham X-Barracuda-Connect: mailgate.ics.forth.gr[139.91.1.2] X-Barracuda-Start-Time: 1277394513 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33432 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean στις 6/24/2010 6:21 PM, O/H Eric Sandeen έγÏαψε: > On 06/24/2010 09:11 AM, Yannis Klonatos wrote: > >> Hello again, >> >> First of all, thank you all for your quick replies. I attach >> all the information you requested in your responses. >> >> 1) The output of xfs_info is the following: >> >> meta-data=/dev/sdf isize=256 agcount=32, agsize=45776328 blks >> = sectsz=512 attr=0 >> data = bsize=4096 blocks=1464842496, imaxpct=25 >> = sunit=0 swidth=0 blks, unwritten=1 >> naming =version 2 bsize=4096 >> log =internal bsize=4096 blocks=32768, version=1 >> = sectsz=512 sunit=0 blks, lazy-count=0 >> realtime =none extsz=4096 blocks=0, rtextents=0 >> >> 2) The output of xfs_bmap in the lineitem.MYI table of the TPC-H >> workload is at one run: >> >> /mnt/test/mysql/tpch/lineitem.MYI: >> EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL >> 0: [0..6344271]: 11352529416..11358873687 31 (72..6344343) 6344272 >> 1: [6344272..10901343]: 1464842608..1469399679 4 (112..4557183) 4557072 >> 2: [10901344..18439199]: 1831053200..1838591055 5 (80..7537935) 7537856 >> 3: [18439200..25311519]: 2197263840..2204136159 6 (96..6872415) 6872320 >> 4: [25311520..26660095]: 2563474464..2564823039 7 (96..1348671) 1348576 >> >> Given that all disk blocks are in units of 512-byte blocks, if I >> interpret the output >> correctly the first file is at block 1465352792 = 698.4GByte offset and >> the last block >> is at 5421.1GByte offset, meaning that this specific table is split over >> a 4,7TByte distance. >> > The file started out in the last AG, and then had to wrap around, > because it hit the end of the filesystem. :) It was then somewhat > sequential in AGs 4,5,6,7 after that, though not perfectly so. > > This run was with a clean filesystem? Was the mountpoint > /mnt/test? XFS distributes new directories into new AGs (allocation > groups, or disk regions) for parallelism, and then files in those dirs > start populating the same AG. So if /mnt/test/mysql/tpch ended up in > the last AG (#31) then the file likely started there, too. > Ok. Your argument makes a lot of sense. However, this is a clean file system (mount point /mnt/test), and I am certain that the files copied before the aforementioned index file (lineitem.MYI) require 28GByte space in total. So, this still raises the question why XFS splitted these files in a way that caused the whole file system space to be "covered", and the lineitem file to be placed starting at the end of the FS (as you mentioned). Also, based on my little XFS knowledge and background, i seriously doubt that parallelism along AGs is an issue here, since the copy utility copies files sequentially, so a new AG would be allocated for the /mnt/test/mysql/tpch directory, and would be populated completely with all its files, before another AG was created. This is true of course, only if your observation holds. > Also, the "inode32" allocator biases data towards the end of the > filesystem, because inode numbers in xfs reflect their on-disk location, > and to keep inodes numbers below 2^32, it must save space in the lower > portions of the filesystem. You might want to re-test with a fresh > filesystem mounted with the "inode64" mount option. > > >> However, in another run (with a clean file system again) >> >> /mnt/test/mysql/tpch/lineitem.MYI: >> EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET >> TOTAL >> 0: [0..26660095]: 11352529416..11379189511 31 (72..26660167) >> 26660096 >> > Hmm. > > >> 3) For the copy, as i mentioned in my previous mail, i copied the >> database over nfs using the cp -R linux program. >> Thus, i believe all the files are copied sequentially, the one after the >> other, with no other concurrent write operations >> running at the background. The file-system was pristine before the cp >> with no files, and just the mount directory was >> created (all the other necessary files and directories are created from >> the cp program). >> > IIRC, copies over NFS can affect xfs allocator performance, because > (IIRC) it tends to close the filehandle periodically and xfs loses the > allocator context. We used to have a filehandle cache which held them > open, but that went away some time ago. > > Dave will probably correct significant swaths of this information for > me, though ;) > > >> 4) The version of xfsprogs is 2.9.4 (acquired with xfs_info -v) and the >> version of the kernel is 2.6.18-164.11.1.el5. >> > Ah! A Red Hat kernel; have you asked your Red Hat support folks for > help on this issue? > I suppose that they will redirect me back to you, won't they? :-) > -Eric > > >> If you require any further information let me know. Let me >> state that i can also provide you with the complete >> data-set if you feel it necessary trying to reproduce the issue. >> >> Thanks, >> Yannis Klonatos >> >>>> Hi all! >>>> >>>> I have come across the following peculiar behavior in XFS >>>> and i would appreciate any information anyone >>>> could provide. >>>> In our lab we have a system that has twelve 500GByte hard >>>> disks (total capacity 6TByte), connected to an >>>> Areca (ARC-1680D-IX-12) SAS storage controller. The disks are >>>> configured as a RAID-0 device. Then I create >>>> a clean XFS filesystem on top of the raid volume, using the whole >>>> capacity. We use this test-setup to measure >>>> performance improvement for a TPC-H experiment. We copy the database >>>> over the clean XFS filesystem using the >>>> cp utility. The database used in our experiments is 56GBytes in size >>>> (data + indices). >>>> The problem is that i have noticed that XFS may - not all >>>> times - split a table over a large disk distance. For >>>> example in one run i have noticed that a file of 13GByte is split >>>> over a 4,7TByte distance (I calculate this distance >>>> by subtracting the final block used for the file with the first one. >>>> The two disk blocks values are acquired using the >>>> FIBMAP ioctl). >>>> Is there some reasoning behind this (peculiar) behavior? I >>>> would expect that since the underlying storage is so >>>> large, and the dataset is so small, XFS would try to minimize disk >>>> seeks and thus place the file sequentially in disk. >>>> Furthermore, I understand that there may be some blocks left unused >>>> by XFS between subsequent file blocks used >>>> in order to handle any write appends that may come afterward. But i >>>> wouldn't expect such a large splitting of a single >>>> file. >>>> Any help? >>>> >>>> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs >> >> > From klonatos@ics.forth.gr Thu Jun 24 15:28: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 o5OKSre3046340 for ; Thu, 24 Jun 2010 15:28:54 -0500 X-ASG-Debug-ID: 1277411494-4c8403370000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mailgate.ics.forth.gr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C135C154542F for ; Thu, 24 Jun 2010 13:31:34 -0700 (PDT) Received: from mailgate.ics.forth.gr (mailgate.ics.forth.gr [139.91.1.2]) by cuda.sgi.com with ESMTP id 5oLrs1bS56y4aXDY for ; Thu, 24 Jun 2010 13:31:34 -0700 (PDT) Received: from av1.ics.forth.gr (av1-in.ics.forth.gr [139.91.1.71]) by mailgate.ics.forth.gr (8.14.3/ICS-FORTH/V10-1.8-GATE) with ESMTP id o5OKVVsJ004496 for ; Thu, 24 Jun 2010 23:31:33 +0300 (EEST) X-AuditID: 8b5b9d47-b7bd0ae000003df0-f5-4c23c0a3d7a2 Received: from enigma.ics.forth.gr (webmail.ics.forth.gr [139.91.1.30]) by av1.ics.forth.gr (SMTP Outbound / FORTH / ICS) with SMTP id 04.84.15856.3A0C32C4; Thu, 24 Jun 2010 23:31:31 +0300 (EEST) Received: from [192.168.1.63] (adsl-200.91.140.92.tellas.gr [91.140.92.200]) (authenticated bits=0) by enigma.ics.forth.gr (8.14.3//ICS-FORTH/V10.3.0C-EXTNULL-SSL-SASL) with ESMTP id o5OKXD3x023817 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 24 Jun 2010 23:33:14 +0300 Message-ID: <4C23C074.5080100@ics.forth.gr> Date: Thu, 24 Jun 2010 23:30:44 +0300 From: Yannis Klonatos User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; el; rv:1.9.1.10) Gecko/20100512 Thunderbird/3.0.5 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Metadata hit ratio Subject: Metadata hit ratio Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Brightmail-Tracker: AAAAAhS+x8EU3liE X-j-chkmail-Score: MSGID : 4C23C0A3.000 on mailgate : j-chkmail score : . : R=. U=. O=. B=0.000 -> S=0.000 X-ICS-JCHK-SCL: Ham X-Barracuda-Connect: mailgate.ics.forth.gr[139.91.1.2] X-Barracuda-Start-Time: 1277411495 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33452 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hello all, Along with my other (yet pending :-( ) question/issue, I have another question (i hope this is the last :-) ) now. I would like to measure the hit ratio of the metadata accesses of XFS (inode+internal buffers). It is my understanding that XFS uses its own data structures, and does not rely on the buffercache mechanisms of the Linux kernel. However, even doing so, there may be cases that the metadata may not fit in the RAM, and I/O operations are required to fetch them from the underlying storage. I have found out that there are two places that XFS uses the submit_bio function. If i add some counters there, would it suffice to measure all the metadata misses? Or is this information available in one (or more) of the xfs_stats counters? And if so, what do i need to sum up in order to get the total metadata hit and miss ratio? Thanks (again!) in advance, Yannis Klonatos From jack@suse.cz Thu Jun 24 16:57: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 o5OLv9dv048441 for ; Thu, 24 Jun 2010 16:57:11 -0500 X-ASG-Debug-ID: 1277417053-4b3a015a0000-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 6190214AFB13 for ; Thu, 24 Jun 2010 15:04:13 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 2WuGPTHEsE2OdX4p for ; Thu, 24 Jun 2010 15:04:13 -0700 (PDT) Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id 7035A89471; Thu, 24 Jun 2010 23:59:48 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id 0D0CB2B1BE6; Thu, 24 Jun 2010 23:59:22 +0200 (CEST) Date: Thu, 24 Jun 2010 23:59:22 +0200 From: Jan Kara To: Christoph Hellwig Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org X-ASG-Orig-Subj: Re: [PATCH 1/2] direct-io: move aio_complete into ->end_io Subject: Re: [PATCH 1/2] direct-io: move aio_complete into ->end_io Message-ID: <20100624215922.GE3345@quack.suse.cz> References: <20100622122144.302857146@bombadil.infradead.org> <20100622123113.011371666@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100622123113.011371666@bombadil.infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1277417054 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33457 Rule breakdown below pts rule 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 22-06-10 08:21:45, Christoph Hellwig wrote: > Filesystems with unwritten extent support must not complete an AIO request > until the transaction to convert the extent has been commited. That means > the aio_complete calls needs to be moved into the ->end_io callback so > that the filesystem can control when to call it exactly. > > This makes a bit of a mess out of dio_complete and the ->end_io callback > prototype even more complicated. In addition ->end_io is now called with > i_alloc_sem held for DIO_LOCKING filesystems. The only filesystem that > has both and ->end_io callback and sets DIO_LOCKING is ext4, which doesn't > appear to do anything that could deadlock with i_alloc_sem in ->end_io. Umm, I don't get this. Looking at the ->end_io callback it has been always called with i_alloc_sem held. It's only aio_complete() which will be called with i_alloc_sem held after your changes. Or am I missing something? Moreover the async testing you do does not seem to be completely right. dio->is_async is a flag that controls whether dio code waits for IO to be completed or not. In particular it is not set for AIO that spans beyond current i_size so it does not seem to be exactly what you need (at least for ext4 it isn't). I think that is_sync_kiocb() is a test that should be used to recognize AIO - and that has an advantage that you don't have to pass the is_async flag around. Honza > > Signed-off-by: Christoph Hellwig > > Index: linux-2.6/fs/direct-io.c > =================================================================== > --- linux-2.6.orig/fs/direct-io.c 2010-06-22 09:48:37.239004298 +0200 > +++ linux-2.6/fs/direct-io.c 2010-06-22 11:54:42.281003878 +0200 > @@ -218,7 +218,7 @@ static struct page *dio_get_page(struct > * filesystems can use it to hold additional state between get_block calls and > * dio_complete. > */ > -static int dio_complete(struct dio *dio, loff_t offset, int ret) > +static int dio_complete(struct dio *dio, loff_t offset, int ret, bool is_async) > { > ssize_t transferred = 0; > > @@ -239,14 +239,6 @@ static int dio_complete(struct dio *dio, > transferred = dio->i_size - offset; > } > > - if (dio->end_io && dio->result) > - dio->end_io(dio->iocb, offset, transferred, > - dio->map_bh.b_private); > - > - if (dio->flags & DIO_LOCKING) > - /* lockdep: non-owner release */ > - up_read_non_owner(&dio->inode->i_alloc_sem); > - > if (ret == 0) > ret = dio->page_errors; > if (ret == 0) > @@ -254,6 +246,17 @@ static int dio_complete(struct dio *dio, > if (ret == 0) > ret = transferred; > > + if (dio->end_io && dio->result) { > + dio->end_io(dio->iocb, offset, transferred, > + dio->map_bh.b_private, ret, is_async); > + } else if (is_async) { > + aio_complete(dio->iocb, ret, 0); > + } > + > + if (dio->flags & DIO_LOCKING) > + /* lockdep: non-owner release */ > + up_read_non_owner(&dio->inode->i_alloc_sem); > + > return ret; > } > > @@ -277,8 +280,7 @@ static void dio_bio_end_aio(struct bio * > spin_unlock_irqrestore(&dio->bio_lock, flags); > > if (remaining == 0) { > - int ret = dio_complete(dio, dio->iocb->ki_pos, 0); > - aio_complete(dio->iocb, ret, 0); > + dio_complete(dio, dio->iocb->ki_pos, 0, true); > kfree(dio); > } > } > @@ -1126,7 +1128,7 @@ direct_io_worker(int rw, struct kiocb *i > spin_unlock_irqrestore(&dio->bio_lock, flags); > > if (ret2 == 0) { > - ret = dio_complete(dio, offset, ret); > + ret = dio_complete(dio, offset, ret, false); > kfree(dio); > } else > BUG_ON(ret != -EIOCBQUEUED); > Index: linux-2.6/fs/ext4/inode.c > =================================================================== > --- linux-2.6.orig/fs/ext4/inode.c 2010-06-22 09:48:37.249004508 +0200 > +++ linux-2.6/fs/ext4/inode.c 2010-06-22 12:18:45.883255381 +0200 > @@ -3775,7 +3775,8 @@ static ext4_io_end_t *ext4_init_io_end ( > } > > static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, > - ssize_t size, void *private) > + ssize_t size, void *private, int ret, > + bool is_async) > { > ext4_io_end_t *io_end = iocb->private; > struct workqueue_struct *wq; > @@ -3784,7 +3785,7 @@ static void ext4_end_io_dio(struct kiocb > > /* if not async direct IO or dio with 0 bytes write, just return */ > if (!io_end || !size) > - return; > + goto out; > > ext_debug("ext4_end_io_dio(): io_end 0x%p" > "for inode %lu, iocb 0x%p, offset %llu, size %llu\n", > @@ -3795,7 +3796,7 @@ static void ext4_end_io_dio(struct kiocb > if (io_end->flag != EXT4_IO_UNWRITTEN){ > ext4_free_io_end(io_end); > iocb->private = NULL; > - return; > + goto out; > } > > io_end->offset = offset; > @@ -3812,6 +3813,9 @@ static void ext4_end_io_dio(struct kiocb > list_add_tail(&io_end->list, &ei->i_completed_io_list); > spin_unlock_irqrestore(&ei->i_completed_io_lock, flags); > iocb->private = NULL; > +out: > + if (is_async) > + aio_complete(iocb, ret, 0); > } > > static void ext4_end_io_buffer_write(struct buffer_head *bh, int uptodate) > Index: linux-2.6/fs/ocfs2/aops.c > =================================================================== > --- linux-2.6.orig/fs/ocfs2/aops.c 2010-06-22 09:48:37.259012749 +0200 > +++ linux-2.6/fs/ocfs2/aops.c 2010-06-22 12:19:03.931005757 +0200 > @@ -609,7 +609,9 @@ bail: > static void ocfs2_dio_end_io(struct kiocb *iocb, > loff_t offset, > ssize_t bytes, > - void *private) > + void *private, > + int ret, > + bool is_async) > { > struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode; > int level; > @@ -623,6 +625,9 @@ static void ocfs2_dio_end_io(struct kioc > if (!level) > up_read(&inode->i_alloc_sem); > ocfs2_rw_unlock(inode, level); > + > + if (is_async) > + aio_complete(iocb, ret, 0); > } > > /* > Index: linux-2.6/fs/xfs/linux-2.6/xfs_aops.c > =================================================================== > --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-06-22 09:48:37.268012190 +0200 > +++ linux-2.6/fs/xfs/linux-2.6/xfs_aops.c 2010-06-22 14:05:02.522005722 +0200 > @@ -1599,7 +1599,9 @@ xfs_end_io_direct( > struct kiocb *iocb, > loff_t offset, > ssize_t size, > - void *private) > + void *private, > + int ret, > + bool is_async) > { > xfs_ioend_t *ioend = iocb->private; > > @@ -1645,6 +1647,9 @@ xfs_end_io_direct( > * against double-freeing. > */ > iocb->private = NULL; > + > + if (is_async) > + aio_complete(iocb, ret, 0); > } > > STATIC ssize_t > Index: linux-2.6/fs/xfs/linux-2.6/xfs_aops.h > =================================================================== > --- linux-2.6.orig/fs/xfs/linux-2.6/xfs_aops.h 2010-06-22 09:48:37.278274238 +0200 > +++ linux-2.6/fs/xfs/linux-2.6/xfs_aops.h 2010-06-22 09:49:12.388034051 +0200 > @@ -37,6 +37,8 @@ typedef struct xfs_ioend { > size_t io_size; /* size of the extent */ > xfs_off_t io_offset; /* offset in the file */ > struct work_struct io_work; /* xfsdatad work queue */ > + struct kiocb *io_iocb; > + int io_result; > } xfs_ioend_t; > > extern const struct address_space_operations xfs_address_space_operations; > Index: linux-2.6/include/linux/fs.h > =================================================================== > --- linux-2.6.orig/include/linux/fs.h 2010-06-22 09:49:07.188253984 +0200 > +++ linux-2.6/include/linux/fs.h 2010-06-22 10:34:10.128005975 +0200 > @@ -415,7 +415,8 @@ struct buffer_head; > typedef int (get_block_t)(struct inode *inode, sector_t iblock, > struct buffer_head *bh_result, int create); > typedef void (dio_iodone_t)(struct kiocb *iocb, loff_t offset, > - ssize_t bytes, void *private); > + ssize_t bytes, void *private, int ret, > + bool is_async); > > /* > * Attribute flags. These should be or-ed together to figure out what > > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Jan Kara SUSE Labs, CR From SRS0+f2mc+24+fromorbit.com=dave@internode.on.net Thu Jun 24 17:22:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5OMMDbD049372 for ; Thu, 24 Jun 2010 17:22:13 -0500 X-ASG-Debug-ID: 1277418293-031201aa0000-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 39AED1546212 for ; Thu, 24 Jun 2010 15:24:53 -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 DCqePXt43nFrvEsr for ; Thu, 24 Jun 2010 15:24:53 -0700 (PDT) Received: from dastard (unverified [121.91.222.126]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 17549871-1927428 for ; Fri, 25 Jun 2010 07:54:52 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1ORuqn-00087a-67 for xfs@oss.sgi.com; Fri, 25 Jun 2010 08:24:49 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1ORuqh-00065Z-ON for xfs@oss.sgi.com; Fri, 25 Jun 2010 08:24:43 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs_db: check for valid inode data pointer before dereferencing Subject: [PATCH] xfs_db: check for valid inode data pointer before dereferencing Date: Fri, 25 Jun 2010 08:24:43 +1000 Message-Id: <1277418283-23381-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1277418295 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33460 Rule breakdown below pts rule 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 When processing an inode, the code checks various flags to determine whether to output messages or not. When checking the CLI provided inode numbers to be verbose about, we fail to check if the inode data structre returned is valid or not before dereferencing it. Hence running xfs_check with the "serious errors only" flag, xfs_db will crash. Fix up the "should we output" logic to be safe. Signed-off-by: Dave Chinner --- db/check.c | 29 ++++++++++++++++------------- 1 files changed, 16 insertions(+), 13 deletions(-) diff --git a/db/check.c b/db/check.c index c62321b..4f8a62a 100644 --- a/db/check.c +++ b/db/check.c @@ -2619,6 +2619,7 @@ process_inode( xfs_qcnt_t ic = 0; xfs_qcnt_t rc = 0; xfs_dqid_t dqprid; + int v = 0; static char okfmts[] = { 0, /* type 0 unused */ 1 << XFS_DINODE_FMT_DEV, /* FIFO */ @@ -2653,15 +2654,16 @@ process_inode( bno = XFS_INO_TO_FSB(mp, ino); blkmap = NULL; } + v = (!sflag || (id && id->ilist) || CHECK_BLIST(bno)); if (idic.di_magic != XFS_DINODE_MAGIC) { - if (!sflag || isfree || id->ilist || CHECK_BLIST(bno)) + if (isfree || v) dbprintf(_("bad magic number %#x for inode %lld\n"), idic.di_magic, ino); error++; return; } if (!XFS_DINODE_GOOD_VERSION(idic.di_version)) { - if (!sflag || isfree || id->ilist || CHECK_BLIST(bno)) + if (isfree || v) dbprintf(_("bad version number %#x for inode %lld\n"), idic.di_version, ino); error++; @@ -2669,7 +2671,7 @@ process_inode( } if (isfree) { if (idic.di_nblocks != 0) { - if (!sflag || id->ilist || CHECK_BLIST(bno)) + if (v) dbprintf(_("bad nblocks %lld for free inode " "%lld\n"), idic.di_nblocks, ino); @@ -2680,21 +2682,22 @@ process_inode( else nlink = idic.di_nlink; if (nlink != 0) { - if (!sflag || id->ilist || CHECK_BLIST(bno)) + if (v) dbprintf(_("bad nlink %d for free inode %lld\n"), nlink, ino); error++; } if (idic.di_mode != 0) { - if (!sflag || id->ilist || CHECK_BLIST(bno)) + if (v) dbprintf(_("bad mode %#o for free inode %lld\n"), idic.di_mode, ino); error++; } return; } + if (be32_to_cpu(dip->di_next_unlinked) != NULLAGINO) { - if (!sflag || isfree || id->ilist || CHECK_BLIST(bno)) + if (v) dbprintf(_("bad next unlinked %#x for inode %lld\n"), be32_to_cpu(dip->di_next_unlinked), ino); error++; @@ -2704,27 +2707,27 @@ process_inode( */ if ((((idic.di_mode & S_IFMT) >> 12) > 15) || (!(okfmts[(idic.di_mode & S_IFMT) >> 12] & (1 << idic.di_format)))) { - if (!sflag || id->ilist || CHECK_BLIST(bno)) + if (v) dbprintf(_("bad format %d for inode %lld type %#o\n"), idic.di_format, id->ino, idic.di_mode & S_IFMT); error++; return; } if ((unsigned int)XFS_DFORK_ASIZE(dip, mp) >= XFS_LITINO(mp)) { - if (!sflag || id->ilist) + if (v) dbprintf(_("bad fork offset %d for inode %lld\n"), idic.di_forkoff, id->ino); error++; return; } if ((unsigned int)idic.di_aformat > XFS_DINODE_FMT_BTREE) { - if (!sflag || id->ilist) + if (v) dbprintf(_("bad attribute format %d for inode %lld\n"), idic.di_aformat, id->ino); error++; return; } - if (verbose || id->ilist || CHECK_BLIST(bno)) + if (verbose || (id && id->ilist) || CHECK_BLIST(bno)) dbprintf(_("inode %lld mode %#o fmt %s " "afmt %s " "nex %d anex %d nblk %lld sz %lld%s%s%s%s%s%s%s\n"), @@ -2844,20 +2847,20 @@ process_inode( } totblocks = totdblocks + totiblocks + atotdblocks + atotiblocks; if (totblocks != idic.di_nblocks) { - if (!sflag || id->ilist || CHECK_BLIST(bno)) + if (v) dbprintf(_("bad nblocks %lld for inode %lld, counted " "%lld\n"), idic.di_nblocks, id->ino, totblocks); error++; } if (nextents != idic.di_nextents) { - if (!sflag || id->ilist || CHECK_BLIST(bno)) + if (v) dbprintf(_("bad nextents %d for inode %lld, counted %d\n"), idic.di_nextents, id->ino, nextents); error++; } if (anextents != idic.di_anextents) { - if (!sflag || id->ilist || CHECK_BLIST(bno)) + if (v) dbprintf(_("bad anextents %d for inode %lld, counted " "%d\n"), idic.di_anextents, id->ino, anextents); -- 1.7.1 From SRS0+mGhR+25+fromorbit.com=david@internode.on.net Thu Jun 24 19:43:53 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_83 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 o5P0hqgf054056 for ; Thu, 24 Jun 2010 19:43:53 -0500 X-ASG-Debug-ID: 1277427057-053b00500000-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 3295C112DDE6 for ; Thu, 24 Jun 2010 17:50:58 -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 wqlAGnVTXagHAtGu for ; Thu, 24 Jun 2010 17:50:58 -0700 (PDT) Received: from dastard (unverified [121.45.182.52]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 29179357-1927428 for multiple; Fri, 25 Jun 2010 10:16:32 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1ORx3u-0000HV-QQ; Fri, 25 Jun 2010 10:46:30 +1000 Date: Fri, 25 Jun 2010 10:46:30 +1000 From: Dave Chinner To: Eric Sandeen Cc: Yannis Klonatos , andi@firstfloor.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS peculiar behavior Subject: Re: XFS peculiar behavior Message-ID: <20100625004630.GS6590@dastard> References: <4C21B9AF.9010307@ics.forth.gr> <20100623231700.GP6590@dastard> <4C236791.1030709@ics.forth.gr> <4C2377ED.8090300@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C2377ED.8090300@sandeen.net> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail12.adl6.internode.on.net[150.101.137.97] X-Barracuda-Start-Time: 1277427059 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33469 Rule breakdown below pts rule 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 24, 2010 at 10:21:17AM -0500, Eric Sandeen wrote: > On 06/24/2010 09:11 AM, Yannis Klonatos wrote: > > Hello again, > > > > First of all, thank you all for your quick replies. I attach > > all the information you requested in your responses. > > > > 1) The output of xfs_info is the following: > > > > meta-data=/dev/sdf isize=256 agcount=32, agsize=45776328 blks > > = sectsz=512 attr=0 > > data = bsize=4096 blocks=1464842496, imaxpct=25 > > = sunit=0 swidth=0 blks, unwritten=1 > > naming =version 2 bsize=4096 > > log =internal bsize=4096 blocks=32768, version=1 > > = sectsz=512 sunit=0 blks, lazy-count=0 > > realtime =none extsz=4096 blocks=0, rtextents=0 > > > > 2) The output of xfs_bmap in the lineitem.MYI table of the TPC-H > > workload is at one run: > > > > /mnt/test/mysql/tpch/lineitem.MYI: > > EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL > > 0: [0..6344271]: 11352529416..11358873687 31 (72..6344343) 6344272 > > 1: [6344272..10901343]: 1464842608..1469399679 4 (112..4557183) 4557072 > > 2: [10901344..18439199]: 1831053200..1838591055 5 (80..7537935) 7537856 > > 3: [18439200..25311519]: 2197263840..2204136159 6 (96..6872415) 6872320 > > 4: [25311520..26660095]: 2563474464..2564823039 7 (96..1348671) 1348576 > > > > Given that all disk blocks are in units of 512-byte blocks, if I > > interpret the output > > correctly the first file is at block 1465352792 = 698.4GByte offset and > > the last block > > is at 5421.1GByte offset, meaning that this specific table is split over > > a 4,7TByte distance. > > The file started out in the last AG, and then had to wrap around, > because it hit the end of the filesystem. :) It was then somewhat > sequential in AGs 4,5,6,7 after that, though not perfectly so. > > This run was with a clean filesystem? Was the mountpoint > /mnt/test? XFS distributes new directories into new AGs (allocation > groups, or disk regions) for parallelism, and then files in those dirs > start populating the same AG. So if /mnt/test/mysql/tpch ended up in > the last AG (#31) then the file likely started there, too. For inode64, yes. For inode32, the first ag is derived from the mp->m_agfrotor and the xfs_rotorstep value. The rate at which mp->m_agfrotor increments for each new file is controlled by the /proc/sys/fs/xfs/rotorstep sysctl. Changing the value of the step will likely change the first AG location of the database in this test. Alternatively, copy the database file first so that it starts in a low AG. > Also, the "inode32" allocator biases data towards the end of the > filesystem, because inode numbers in xfs reflect their on-disk location, > and to keep inodes numbers below 2^32, it must save space in the lower > portions of the filesystem. You might want to re-test with a fresh > filesystem mounted with the "inode64" mount option. Or just use inode64 ;) > > > However, in another run (with a clean file system again) > > > > /mnt/test/mysql/tpch/lineitem.MYI: > > EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET > > TOTAL > > 0: [0..26660095]: 11352529416..11379189511 31 (72..26660167) > > 26660096 > > Hmm. > > > 3) For the copy, as i mentioned in my previous mail, i copied the > > database over nfs using the cp -R linux program. > > Thus, i believe all the files are copied sequentially, the one after the > > other, with no other concurrent write operations > > running at the background. The file-system was pristine before the cp > > with no files, and just the mount directory was > > created (all the other necessary files and directories are created from > > the cp program). > > IIRC, copies over NFS can affect xfs allocator performance, because > (IIRC) it tends to close the filehandle periodically and xfs loses the > allocator context. We used to have a filehandle cache which held them > open, but that went away some time ago. The filehandle cache was used in 2.4 to prevent cached inodes being torn down when NFS stops referencing it, only to have to rebuild it a few ms later when the next request comes in. The frequentteardown was what caused the problems on those kernels, which was why the cache helped prevent bad allocation patterns. That doesn't happen in 2.6 kernels, but it has other idiosyncracies... :) > Dave will probably correct significant swaths of this information for > me, though ;) Only minor bits ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+ruNp+25+fromorbit.com=david@internode.on.net Thu Jun 24 19:56:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_83 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 o5P0u8YA054365 for ; Thu, 24 Jun 2010 19:56:08 -0500 X-ASG-Debug-ID: 1277427794-05ab00f30000-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 A3087112E97B for ; Thu, 24 Jun 2010 18:03:14 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id TxGkthzap62HLIni for ; Thu, 24 Jun 2010 18:03:14 -0700 (PDT) Received: from dastard (unverified [121.45.182.52]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 29274249-1927428 for multiple; Fri, 25 Jun 2010 10:28:48 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1ORxFc-0000I3-KN; Fri, 25 Jun 2010 10:58:36 +1000 Date: Fri, 25 Jun 2010 10:58:36 +1000 From: Dave Chinner To: Yannis Klonatos Cc: Eric Sandeen , andi@firstfloor.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS peculiar behavior Subject: Re: XFS peculiar behavior Message-ID: <20100625005836.GT6590@dastard> References: <4C21B9AF.9010307@ics.forth.gr> <20100623231700.GP6590@dastard> <4C236791.1030709@ics.forth.gr> <4C2377ED.8090300@sandeen.net> <4C237B4E.8030606@ics.forth.gr> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <4C237B4E.8030606@ics.forth.gr> 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: 1277427795 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33469 Rule breakdown below pts rule 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 24, 2010 at 06:35:42PM +0300, Yannis Klonatos wrote: > στις 6/24/2010 6:21 PM, O/H Eric Sandeen έγÏαψε: > >On 06/24/2010 09:11 AM, Yannis Klonatos wrote: > >>2) The output of xfs_bmap in the lineitem.MYI table of the TPC-H > >>workload is at one run: > >> > >>/mnt/test/mysql/tpch/lineitem.MYI: > >> EXT: FILE-OFFSET BLOCK-RANGE AG AG-OFFSET TOTAL > >> 0: [0..6344271]: 11352529416..11358873687 31 (72..6344343) 6344272 > >> 1: [6344272..10901343]: 1464842608..1469399679 4 (112..4557183) 4557072 > >> 2: [10901344..18439199]: 1831053200..1838591055 5 (80..7537935) 7537856 > >> 3: [18439200..25311519]: 2197263840..2204136159 6 (96..6872415) 6872320 > >> 4: [25311520..26660095]: 2563474464..2564823039 7 (96..1348671) 1348576 > >> > >>Given that all disk blocks are in units of 512-byte blocks, if I > >>interpret the output > >>correctly the first file is at block 1465352792 = 698.4GByte offset and > >>the last block > >>is at 5421.1GByte offset, meaning that this specific table is split over > >>a 4,7TByte distance. > >The file started out in the last AG, and then had to wrap around, > >because it hit the end of the filesystem. :) It was then somewhat > >sequential in AGs 4,5,6,7 after that, though not perfectly so. > > > >This run was with a clean filesystem? Was the mountpoint > >/mnt/test? XFS distributes new directories into new AGs (allocation > >groups, or disk regions) for parallelism, and then files in those dirs > >start populating the same AG. So if /mnt/test/mysql/tpch ended up in > >the last AG (#31) then the file likely started there, too. > > Ok. Your argument makes a lot of sense. However, this is a clean > file system (mount point /mnt/test), and > I am certain that the files copied before the aforementioned index > file (lineitem.MYI) require 28GByte space > in total. So, this still raises the question why XFS splitted these > files in a way that caused the whole file system > space to be "covered", and the lineitem file to be placed starting > at the end of the FS (as you mentioned). XFS spreads allocation out over it's entire address space to enable utilisation of all the disks backing the filesystem (think linear concatenation of devices). This is sub-optimal for a small number of spindles, but XFS is designed to scale to hundreds to thousands of disks effectively. > >>4) The version of xfsprogs is 2.9.4 (acquired with xfs_info -v) and the > >>version of the kernel is 2.6.18-164.11.1.el5. > >Ah! A Red Hat kernel; have you asked your Red Hat support folks for > >help on this issue? > > I suppose that they will redirect me back to you, won't they? :-) Or me ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+NyVv+25+fromorbit.com=dave@internode.on.net Thu Jun 24 20:06:17 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5P16GPD054651 for ; Thu, 24 Jun 2010 20:06:17 -0500 X-ASG-Debug-ID: 1277428138-3be703bc0000-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 A634D402769 for ; Thu, 24 Jun 2010 18:08:58 -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 ONjF7hO5sQGMXFBU for ; Thu, 24 Jun 2010 18:08:58 -0700 (PDT) Received: from dastard (unverified [121.45.182.52]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 17569317-1927428 for ; Fri, 25 Jun 2010 10:38:57 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1ORxPS-0000Iy-25 for xfs@oss.sgi.com; Fri, 25 Jun 2010 11:08:46 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1ORxPM-00075U-UM for xfs@oss.sgi.com; Fri, 25 Jun 2010 11:08:40 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: unregister inode shrinker before freeing filesystem structures Subject: [PATCH] xfs: unregister inode shrinker before freeing filesystem structures Date: Fri, 25 Jun 2010 11:08:40 +1000 Message-Id: <1277428120-27216-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: bld-mail15.adl6.internode.on.net[150.101.137.100] X-Barracuda-Start-Time: 1277428139 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33470 Rule breakdown below pts rule 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 Currently we don't remove the XFS mount from the shrinker list until late in the unmount path. By this time, we have already torn down the internals of the filesystem (e.g. the per-ag structures), and hence if the shrinker is executed between the teardown and the unregistering, the shrinker will get NULL per-ag structure pointers and panic trying to dereference them. Fix this by removingthe xfs mount from the shrinker list before tearing down it's internal structures. Signed-off-by: Dave Chinner --- fs/xfs/linux-2.6/xfs_super.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index e3de46c..4605cd4 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1156,9 +1156,13 @@ xfs_fs_put_super( XFS_bflush(mp->m_ddev_targp); + /* + * Unregister the memory shrinker before we tear down the mount + * structure so we don't have memory reclaim racing with us here. + */ + xfs_inode_shrinker_unregister(mp); xfs_unmountfs(mp); xfs_freesb(mp); - xfs_inode_shrinker_unregister(mp); xfs_icsb_destroy_counters(mp); xfs_close_devices(mp); xfs_free_fsname(mp); -- 1.7.1 From SRS0+I08u+25+fromorbit.com=david@internode.on.net Thu Jun 24 20:13:10 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_36 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5P1D9L7054950 for ; Thu, 24 Jun 2010 20:13:09 -0500 X-ASG-Debug-ID: 1277428550-3ba903e70000-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 F03DF402A12 for ; Thu, 24 Jun 2010 18:15:50 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id boz8qj86saR85fDQ for ; Thu, 24 Jun 2010 18:15:50 -0700 (PDT) Received: from dastard (unverified [121.45.182.52]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 29468095-1927428 for multiple; Fri, 25 Jun 2010 10:45:48 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1ORxWF-0000Jl-Hp; Fri, 25 Jun 2010 11:15:47 +1000 Date: Fri, 25 Jun 2010 11:15:47 +1000 From: Dave Chinner To: Yannis Klonatos Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Metadata hit ratio Subject: Re: Metadata hit ratio Message-ID: <20100625011547.GU6590@dastard> References: <4C23C074.5080100@ics.forth.gr> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C23C074.5080100@ics.forth.gr> 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: 1277428551 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0011 1.0000 -2.0141 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.91 X-Barracuda-Spam-Status: No, SCORE=-1.91 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.33470 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 Thu, Jun 24, 2010 at 11:30:44PM +0300, Yannis Klonatos wrote: > Hello all, > > Along with my other (yet pending :-( ) question/issue, I > have another question (i hope this is the last :-) ) > now. > I would like to measure the hit ratio of the metadata > accesses of XFS (inode+internal buffers). It is my > understanding that XFS uses its own data structures, and does not > rely on the buffercache mechanisms of > the Linux kernel. However, even doing so, there may be cases that > the metadata may not fit in the RAM, > and I/O operations are required to fetch them from the underlying > storage. I have found out that there are > two places that XFS uses the submit_bio function. If i add some > counters there, would it suffice to measure all > the metadata misses? > Or is this information available in one (or more) of the > xfs_stats counters? And if so, what do i need to sum > up in order to get the total metadata hit and miss ratio? Start by looking here: http://xfs.org/index.php/Runtime_Stats But you probably want some of the buf counters which are undocumented on that page, so a rough description of them is (from PCP): $ pminfo -t xfs.buffer xfs.buffer.get [number of request buffer calls] xfs.buffer.create [number of buffers created] xfs.buffer.get_locked [number of requests for a locked buffer which succeeded] xfs.buffer.get_locked_waited [number of requests for a locked buffer which waited] xfs.buffer.busy_locked [number of non-blocking requests for a locked buffer which failed] xfs.buffer.miss_locked [number of requests for a locked buffer which failed due to no buffer] xfs.buffer.page_retries [number of retry attempts when allocating a page for insertion in a buffer] xfs.buffer.page_found [number of hits in the page cache when looking for a page] xfs.buffer.get_read [number of buffer get calls requiring immediate device reads] So you might be able to get something from those stats. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Thu Jun 24 23:09:26 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5P49Qk2067749 for ; Thu, 24 Jun 2010 23:09:26 -0500 X-ASG-Debug-ID: 1277439128-5a91007a0000-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 05FE51D60C83 for ; Thu, 24 Jun 2010 21:12:08 -0700 (PDT) Received: from mail.sandeen.net (64-131-60-146.usfamily.net [64.131.60.146]) by cuda.sgi.com with ESMTP id 4RTIaJ0yEZOCKz04 for ; Thu, 24 Jun 2010 21:12:08 -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 9266C49632BB; Thu, 24 Jun 2010 23:12:07 -0500 (CDT) Message-ID: <4C242C97.8060506@sandeen.net> Date: Thu, 24 Jun 2010 23:12:07 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.24 (Macintosh/20100228) MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: unregister inode shrinker before freeing filesystem structures Subject: Re: [PATCH] xfs: unregister inode shrinker before freeing filesystem structures References: <1277428120-27216-1-git-send-email-david@fromorbit.com> In-Reply-To: <1277428120-27216-1-git-send-email-david@fromorbit.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: 1277439129 X-Barracuda-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.33482 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: > From: Dave Chinner > > Currently we don't remove the XFS mount from the shrinker list until late in > the unmount path. By this time, we have already torn down the internals of the > filesystem (e.g. the per-ag structures), and hence if the shrinker is executed > between the teardown and the unregistering, the shrinker will get NULL per-ag > structure pointers and panic trying to dereference them. > > Fix this by removingthe xfs mount from the shrinker list before tearing down > it's internal structures. > > Signed-off-by: Dave Chinner Looks right to me, and is more symmetric with setup I think. Reviewed-by: Eric Sandeen > --- > fs/xfs/linux-2.6/xfs_super.c | 6 +++++- > 1 files changed, 5 insertions(+), 1 deletions(-) > > diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c > index e3de46c..4605cd4 100644 > --- a/fs/xfs/linux-2.6/xfs_super.c > +++ b/fs/xfs/linux-2.6/xfs_super.c > @@ -1156,9 +1156,13 @@ xfs_fs_put_super( > > XFS_bflush(mp->m_ddev_targp); > > + /* > + * Unregister the memory shrinker before we tear down the mount > + * structure so we don't have memory reclaim racing with us here. > + */ > + xfs_inode_shrinker_unregister(mp); > xfs_unmountfs(mp); > xfs_freesb(mp); > - xfs_inode_shrinker_unregister(mp); > xfs_icsb_destroy_counters(mp); > xfs_close_devices(mp); > xfs_free_fsname(mp); From BATV+f4c47461274eedfc3678+2497+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 25 01:33:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5P6XVYf133128 for ; Fri, 25 Jun 2010 01:33:33 -0500 X-ASG-Debug-ID: 1277447774-680102a90000-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 9324240319C for ; Thu, 24 Jun 2010 23:36:14 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id H8AiEmiaCM3qBQmO for ; Thu, 24 Jun 2010 23:36:14 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OS2WI-0001pR-PH; Fri, 25 Jun 2010 06:36:10 +0000 Date: Fri, 25 Jun 2010 02:36:10 -0400 From: Christoph Hellwig To: Jan Kara Cc: Christoph Hellwig , linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org X-ASG-Orig-Subj: Re: [PATCH 1/2] direct-io: move aio_complete into ->end_io Subject: Re: [PATCH 1/2] direct-io: move aio_complete into ->end_io Message-ID: <20100625063610.GA4128@infradead.org> References: <20100622122144.302857146@bombadil.infradead.org> <20100622123113.011371666@bombadil.infradead.org> <20100624215922.GE3345@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100624215922.GE3345@quack.suse.cz> 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: 1277447774 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 24, 2010 at 11:59:22PM +0200, Jan Kara wrote: > Umm, I don't get this. Looking at the ->end_io callback it has been > always called with i_alloc_sem held. It's only aio_complete() which will > be called with i_alloc_sem held after your changes. Or am I missing > something? No, that part of the commit message is flat out wrong. Not sure what I was thinking when I wrote it. > Moreover the async testing you do does not seem to be completely right. > dio->is_async is a flag that controls whether dio code waits for IO to be > completed or not. In particular it is not set for AIO that spans beyond > current i_size so it does not seem to be exactly what you need (at least > for ext4 it isn't). I think that is_sync_kiocb() is a test that should be > used to recognize AIO - and that has an advantage that you don't have to > pass the is_async flag around. No. is_sync_kiocb() means the ioctb was not intended as sync I/O from the start. But we can only call aio_complete when we returned -EIOCBQUEUED from ->aio_read/write. Take a look at the comment near the end of direct_io_worker(). AIO beyond i_size is not supported using blockdev_direct_IO yet. I think I can add it fairly easily for XFS, but that will require passing a new DIO_* flag to __blockdev_direct_IO which will make is_async true for writes beyond i_size. From jack@suse.cz Fri Jun 25 05:33:35 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5PAXYpv140158 for ; Fri, 25 Jun 2010 05:33:35 -0500 X-ASG-Debug-ID: 1277462176-2ac800ac0000-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 7AD8F1D6139F for ; Fri, 25 Jun 2010 03:36:17 -0700 (PDT) Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id ZllTy3DxKRehNZEO for ; Fri, 25 Jun 2010 03:36:17 -0700 (PDT) Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id 2636886A2E; Fri, 25 Jun 2010 12:36:16 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 10005) id CEF602B1BE8; Fri, 25 Jun 2010 12:35:50 +0200 (CEST) Date: Fri, 25 Jun 2010 12:35:50 +0200 From: Jan Kara To: Christoph Hellwig Cc: Jan Kara , linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org X-ASG-Orig-Subj: Re: [PATCH 1/2] direct-io: move aio_complete into ->end_io Subject: Re: [PATCH 1/2] direct-io: move aio_complete into ->end_io Message-ID: <20100625103550.GA3586@quack.suse.cz> References: <20100622122144.302857146@bombadil.infradead.org> <20100622123113.011371666@bombadil.infradead.org> <20100624215922.GE3345@quack.suse.cz> <20100625063610.GA4128@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100625063610.GA4128@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1277462177 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33508 Rule breakdown below pts rule 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 25-06-10 02:36:10, Christoph Hellwig wrote: > On Thu, Jun 24, 2010 at 11:59:22PM +0200, Jan Kara wrote: > > Moreover the async testing you do does not seem to be completely right. > > dio->is_async is a flag that controls whether dio code waits for IO to be > > completed or not. In particular it is not set for AIO that spans beyond > > current i_size so it does not seem to be exactly what you need (at least > > for ext4 it isn't). I think that is_sync_kiocb() is a test that should be > > used to recognize AIO - and that has an advantage that you don't have to > > pass the is_async flag around. > > No. is_sync_kiocb() means the ioctb was not intended as sync I/O from > the start. But we can only call aio_complete when we returned > -EIOCBQUEUED from ->aio_read/write. Take a look at the comment near the > end of direct_io_worker(). Ah, I see. Thanks for explanation. It's ugly but I also don't see a nicer way how to handle this. Honza -- Jan Kara SUSE Labs, CR From prvs=0792616bd9=E.Lee@herts.ac.uk Fri Jun 25 16:02:14 2010 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5PL2DeZ158774 for ; Fri, 25 Jun 2010 16:02:13 -0500 X-ASG-Debug-ID: 1277499892-12a9006b0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from kumbha.herts.ac.uk (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 151F71E161FE; Fri, 25 Jun 2010 14:04:53 -0700 (PDT) Received: from kumbha.herts.ac.uk (kumbha.herts.ac.uk [147.197.215.115]) by cuda.sgi.com with ESMTP id jqzSTNlW2ECYfTla; Fri, 25 Jun 2010 14:04:53 -0700 (PDT) Received: from prayer by kumbha.herts.ac.uk with local (Exim 4.68) (envelope-from ) id 1OSFjN-0001qD-0j; Fri, 25 Jun 2010 21:42:33 +0100 From: "Dupas Pascaline (Mrs.)" Reply-To: alex.lundberg@grants.globalrgt.org X-ASG-Orig-Subj: Funding Opportunity Announcement Subject: Funding Opportunity Announcement Date: 25 Jun 2010 21:42:32 +0100 X-Mailer: Prayer v1.0.18 X-Originating-IP: [84.19.165.217] Message-ID: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="--559023410-1251336619-1277498552=:15176" X-KU-UH-MailScanner-Information: Please contact the HelpDesk for more information X-HE-UH-MailScanner: No Virus detected X-KU-UH-MailScanner-From: e.lee@herts.ac.uk X-Spam-Status: No X-Barracuda-Connect: kumbha.herts.ac.uk[147.197.215.115] X-Barracuda-Start-Time: 1277499895 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0802 1.0000 -1.5125 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.07 X-Barracuda-Spam-Status: No, SCORE=0.07 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33550 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.58 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. ----559023410-1251336619-1277498552=:15176 Content-Type: text/plain; format=flowed; charset=ISO-8859-1 Content-Transfer-Encoding: QUOTED-PRINTABLE --=20 Dated: 25th June, 2010 Following the economic recovery process, please, find attached a PDF docume= nt which contains detailed information about the ongoing Government Grant. Since the recession is a worldwide problem, this grant opportunity is open = to any individual that is 18 and above worldwide. We hope the attached document will be of great help to you. Sincerely, Dupas Pascaline, (Public Information Officer) United Kingdom +++++CONFIDENTIALITY NOTICE+++++ This e-mail and any attachments are confidential and may be privileged. If = you are not a emailed recipient, please notify the sender immediately and d= o not disclose the contents to another person, use it for any purpose or st= ore or copy the information in any medium. =A92010 Government Grants. All Rights Reserved ----559023410-1251336619-1277498552=:15176 Content-Type: application/pdf; name="PERSONAL GRANT INFORMATION.pdf" Content-Disposition: attachment; filename="PERSONAL GRANT INFORMATION.pdf" Content-Description: PERSONAL GRANT INFORMATION.pdf Content-Transfer-Encoding: BASE64 JVBERi0xLjMNCiXi48/TDQo0IDAgb2JqDQo8PA0KL1R5cGUgL1BhZ2UNCi9Q YXJlbnQgMiAwIFINCi9Db250ZW50cyAxMCAwIFINCi9NZWRpYUJveCBbMC4w MDAwIDAuMDAwMCA2MTIuMDAwMCA3OTIuMDAwMF0NCi9UcmltQm94IFswLjAw MDAgMC4wMDAwIDYxMi4wMDAwIDc5Mi4wMDAwXQ0KL0Nyb3BCb3ggWzAuMDAw MCAwLjAwMDAgNjEyLjAwMDAgNzkyLjAwMDBdDQovUmVzb3VyY2VzIDw8DQov UHJvY1NldCBbL1BERiAvSW1hZ2VDIC9UZXh0XQ0KL1hPYmplY3QgPDwgL0lt MTIgMTIgMCBSICAvSW0xMyAxMyAwIFIgIC9JbTIyIDIyIDAgUiAgL0ltMjMg MjMgMCBSICAvSW0yNCAyNCAwIFIgIC9JbTI1IDI1IDAgUiA+Pg0KL0ZvbnQg PDwgL0YxNCAxNCAwIFIgIC9GMTggMTggMCBSID4+DQovRXh0R1N0YXRlIDw8 IC9HUzExIDExIDAgUiA+Pg0KPj4NCj4+DQplbmRvYmoNCjEwIDAgb2JqDQo8 PA0KL0ZpbHRlciBbL0ZsYXRlRGVjb2RlIF0NCi9MZW5ndGggMTk3Mg0KPj4N CnN0cmVhbQ0KeNqlWNly28gVfWcV/+E+alIKjF7Q6J6nKBblaCxRCpdUuTJ5 gAiQhAcEOAAoRd+RfHBOY6EIkEpZHJVlUg30Xc49d+lmjmt/yO19ss7f7cdi Mxx8+jJljFbFcPD7cOAZRyilxNF+PGDKSJckgyjPV+Qz4fhcmVrI7YZxus6G g7/3JPqe40mF9/sS9w8Y9x3puZp813e4NnIvURxLdOkX+9/34YBbOYxehgPW iHQ115pxjxm6Hw7++S9yKcTLjq+htLKg+ub59BWbpOMa7pPv+w7T+LKx3sMm zzdvi8nBojLGUR4gSN52H66th4OiY6qjLY6scplVftNvw8FfZ9iujeML4xKg xn7m0ewaW2+YBBp1aGbL4eDi28N8QjeT0Yi+TK7GM7od3zxM7q9mtw/jn2bA YDT7QYUIn4vAktAKzijW6tNdfRQk0b+dZJeGT1G++ssqr7QwAKwNEGhYY/de BGlZOKskewqSfFU6Wb76mEXMFQ5jQpLwQSgha5Mu6AoW0F1jwQdFeo6rpSCO oLgeV7XEm/ndHY2v7kc/05nitHSk0ofirq6vJ6NpJU4LxyjE7RCb6dmqlHG0 lqYW8/lhPp5NvlWiPOQI91lHzdlaPM8RLvK1kjIb3Y0e//Ywfg8f14ozNnGM PClOCeCj2wCOFlmabeIFTSppcEjqnt3RInuuHiLxPcNE92H+SrfpMss3QRln 6UmTjhO6b5ILD5lqPawtASZCdXRltM2zTVZGtMqzl3JNQRrSIo+gOV1RGr3Q 9+ypoDilch3RaJdn2yhIa5iE56JUGtP3DM5XzyUqCPN45/FrHUqg6XcNuaSX iIIcdsTPVnW2Kymg+nUmYLnXVxTkySudB45n8EjwuuZchFlaAU1lRslu8dsr 5dEi3sYR8vuSgoKWyEXY9CmIQ1oCrkMsaiSQwJ7Q3RRIaZ5C6mUPtY8b68N7 qXWTEdlmExdFJRjyyyikcWU9TJ1/pS9ZTSuGIsd9t2PQc0MCY7welHm6gbNV 7K1rjdxpGZRRQdxFJtVU5gKpzoT+GJcfkyB1zvRdwlztNtVgZm37SqvaR8Ud 1Ez+novqpItx0SXYIijW1BZ5reFAj7Ao8p/2BEFOtpR0kdVG+t1k2uWUvaS0 jfICW5JLisLdotpq/zgHAowdAn4an7fmhPS0K+I0KgoKo+fGGOkww7uGR0m2 rVz+9WJ6P2o5/OtPzplmoFlxbsQ+EkhVgLnJ8FmuQe4AH9musAZm222Wlzuw KAZ/LGg1P4x0tM+7pGyxh5Pa94/6axWm0mpDgWicFY6WuteK46peWVVhVER5 FeHzHEWmOUp6Ta8LttskXlSdnrr0Y4I5vss/yL8igk9BEYcRrYNkaVHL4ySx 5CrKKE9aLxpYuGZoZvx47qAoWKwbLtoGwzzWr461lb6DSc7rldoigxfn4uNj 8FOswSePV2vk0ToKwqp8FBFosWyTRIIzytO9JEHSpbSKyuYtyDNCuEeZVKzR Ds5hq/BJSlDN4MvpofIGCFfMjf9Qm7WK8AVHAPedafImzovyktATy2BR0uPu CWw6bO70sFzGi6iK+TIHeE3YPYfLHoUCVP2iDNJFdFYpgbH16Is2VY8pf94E cVL3L1v4VDdOP5+pA63Q+FK23ap2fBxsonMFSu5oV/nNXGnnizBpxgjQS/i8 R+64qvLxxtYgpIqtTuV+kBDoGUr0CYkZqMVBa9Ft4882V21XXGZJkr3YBD1g jZ0Zclvl7Tt17DCnKt/tColQtPMwSmtjzgECpwSuUYG5PhykTjRzuLNppxJ4 w7okeqUoXWS7FLWGwl1uvSnXgAsILNBSnPNM4xwjivCa5nCLZhCGcQuPxS54 eiuaePlHi+Yl7Yoa/GL39D0Ckf7TOQXWgHPY5fbmDns+/G9VkeJ0kewQwjAq QXeMNWe4iALMcej3vLbsHTIA/166FGNKqiOKYQiyaIQZvcRlW7qZtR1peVT8 mvqPwReDvNcv/3YoLTIoxmctyGjIcfvjiB1ko7jGFyce1xO9LlETG6PBWZFH K2faNu6m0F7c0hqTbs2oQ4he0OLoKaJsSeso2VocXptkQTNxpezZfUlnREmh hzBbEpjXmHM9f6y1SFuSuq5fTelxP7UyZnoPP1/d3Y5HZ2KCMqIEa4y4QVX/ 9G7hz3/8/HpwY8IdT7nVfY0EgaRiB4tJb9EFJtV9zeH2dnE9HCz/9AOH3co1 jBjKFlCDGgTV3FWOb6zAdjHpLKJsY1aoVO93v62d0HwS2HavxCyh7Yl9Y9cM zoM4FewXk94izvf6UPPh2pHm35E+Eo+N8o6u6BSMwZnAB7McgfmXfIZZW3K/ vaHjp+/8cMBkxuXqlEDGleaomdCphFdJ9Ow9XitRnL5F1Pa4o8zxvST6DZdK YUTXIA1GEB9TH/cl30uUJyVKdH0uGDtlo5SYakjANGNPOdZG/O5vOnF0/j/3 kuwP3ktyHDK1W1+vei7v3ku2i4jk9AcTkwtH2RqOrmxv8cTbVGjvONtZbTSf PDyOrsY0H793ufh+6qM3u0cqLiBpNrqmcXVdOf2YSG4pe0LklCajzw//GE2+ 0XR2ez+/m39QsHS9k4K/0hcrdnw/Gs8+KNGwEwC/Afr54f7+djo9RPV/p8VR +WVuZHN0cmVhbQ0KZW5kb2JqDQoxMiAwIG9iag0KPDwNCi9UeXBlIC9YT2Jq ZWN0DQovU3VidHlwZSAvSW1hZ2UNCi9OYW1lIC9JbTEyDQovRmlsdGVyIFsv RENURGVjb2RlXQ0KL1dpZHRoIDE2NA0KL0hlaWdodCAxNjMNCi9CaXRzUGVy Q29tcG9uZW50IDgNCi9Db2xvclNwYWNlIC9EZXZpY2VDTVlLIA0KL0xlbmd0 aCA1NDk5Mw0KPj4NCnN0cmVhbQ0K/9j/4AAQSkZJRgABAQEAyQDJAAD/7gAO QWRvYmUAZAAAAAAA/9sAQwABAQEBAQEBAQEBAQEBAQECAQEBAQECAQEBAgIC AgICAgICAwMEAwMDAwMCAgMEAwMEBAQEBAIDBQUEBAUEBAQE/8AAFAgAowCk BEMRAE0RAFkRAEsRAP/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkK C//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGh CCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RV VldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeo qaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX2 9/j5+v/aAA4EQwBNAFkASwAAPwD/AD/6/wA/+v8AP/r/AD/6KKKKft2kYOT6 dDSg4IPpU0JQSgvlVB4Udee1FOweF3HrkDb1qQkMuDITjouznPNStGyN5oQi IklAOfUUU/1PYDJpoD/MQfu/ePWmlljLBVGABk7jRUGMYJHB6U3BIHpzikYR BQwXOegyRn1ooIA6HP4YobAJ2nI7HpSMsxBB5H4DNFAyGA6HNA6j61LZ2xuJ ok6b5FVfQ5OKK9z+GGi2Aube9u9FtvEN7d2t5PZabqFvey2FpBZxC5uNQLWd 3bzh4UhuCqZdWxyh4Nfd/wCx38ILXxn4hXV7/wAKQeMZI7HUL600bUbfUJ9L t7fT7dry71N2sby2uQ1vFbXLKgLqxUZjYhSP7hv+Def/AII+fDH4z+A7b9pT 45aFbeK4tSlvrTwL4T1q31J9DVLBrZpNdaXTNTs7pZYJILyCOCQyRuxDGIkI 4B9M+1ZPiFPD+u+Llv4NKtfC+hamv2hdL0p5Y9P08BGPlQSzyzSMu5QN0jsw zgkkEnyf4z6V4RuPi7eSaToNp4J8K6sftdtoelGddO0obGzDBNcTTyMu9cbp HdhuwxZgSfMf+Ckn/BKn4Y+Hf+CgOjaPoPh5Phr8FfiRYxaxaw6Ja3GneH9A MdpIJLe2vrue5MoaeFMyO5ZPtPlkEpudSckkAAE5AGcD2pkOi6W1xG02jyWk FsI1uQNXF2sqggSOVCZDEbmI8xBwQCOlctp/gu3nuo5rvw/Pa6dahGvJP7aF 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 gk2iTGVhfYejN043A4984OK2vhDeTWb6qWne3tJokE5OVgl8vdkFumV3g8+v tx/Qt/waw/HHTPhVqHxot/FevtonhfUtE0+4ne7Jh0qaSza5JLz42KYxcg7W I3CQnDbMgr0CPT57K+0XULQ201np2gzI+oWl0k8U0/kXVxtlKn5Tul8jB6iF uwOO/wBQtr2PxxpHifRUt9S0vStGm36tYXS3EE85t7mcrIVPy/NKYMHqsLHp nH3L+3T+11a3H/BRX4VftE/B7VvD/jHwV8L/AIc32ny+JvDHiW31TTdTvRpm tXZjuJIiwTdJffYjuzuWzlP3QdpS+JLLUP7Rlv4o7S1t2tY1nMkiRWt7I5LB 0XIOBu2B+cvCy5PIqt4rg8RDxlN4ghgtdOtbqCJbtpp0t7G/eQfeRCQSPm2B xn54ioJ6Hj/jT/wUo+OR/a+8NeM/At3ofgzwPr2i6Z4c8W6bq+rQW/h3xfLI R/pQiLo58sXIt47nlvOsniDOuUYrjfEunxx6cl5ND9nu5rsoAfk88bSXyp7q dnI/vnPWuC+Jui6fZQWeoR2v2O9vLhhOuSDcHbuclT3UlM4/v89RXxT/AMHF 3wK/Z30zwD8Pfjb4P0nTdC+Knj/VJ5fEkFlc7Dq5+zJJczSW5bHmRSNAGdAo zdHf8zCir3wv8GweK/EVja6gzW+jNdGO+vVwXt0WKSeTaCCN5jhkCFgV3sme Ditb9nn4VxfFTx9o+gah5lvo1zeiLUtQjI3WcaxSzyFRgguY4JQhYFd5TcMH B/ID/gjD/wAE6f8AhvD9pbwx4M8Qpc2Hw7/tQDxhrlsEebTbeK3ub2QRBgw8 2SG0mjhd0aMTSQ7wVO1ivqrVNA+HfhTwx4o1vQtR8YWur2Why6dDfp4kAutY t5kEB0+7XyTDJaup2yQ+WFZRtPHFfpn8V/gJ8DPhB8MPE/i/w3e+OIvEmn6B Lpqakvij/SdYhmjFudPvE8hoJLV1JV4TGFZflJxxX9m3/BQL/gjj+wh+yn+x F8ZfjB4F0n4maR49+H3w1u7Wx8UxfEad9X8UwzRLaro2pxSQyWUthLuVJLYW yoUyowOKKt/tKftH6V+2Db/DWI/BT9nv4L+Ifh58NLDwrqHjr4V+DdV0DxN8 T73S7Y2sNvqGkafIdLt2vJJVKPFYRMZQS94YtkUXx3+0l+0Jo/7Vsnw/ks/g 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 aPcegykc3J9DXIeG1bz53QMJwIorCbB2Q3DTxsmT0GVSXr1wa/Mr4E+Nde+H et6j4g8OG5ttXs3gj0e+j3ILG9+2W8kL7/4Tshm+Y9g1Fc/cXc008s0jl5Jp DJI7EKzMxySfqawZ55riaWZ2Z5JZDJI7PhmYkkk/U815f4z+KPibxT4l1bX9 U1W4utR1S7e7vbiSUmSeV2LO7H1Ykn8aKnsL6XT7mK5gYo8L7weTnsc+oPP8 qm03UJtOu4ruBykkT71Y5IPqCPQ88fWu/wD2af2jPFH7N/xE0Tx/4SupLPUt Fvku4sOTHJt+V0cdGR1Lqw7qxFFdS/iO3dZpIdOigvLsbZ7gMXHJDMVUnAJI J/xruV8aWtuXvNN0e3s9YnUrNqHnGUZbG5lQ8Anmv6A/AH/Ba/w54Q1QeL/h p8FvCHgz4u+K9lt4h8cW9y180rO0RmlhtZF8tHkcO3tlfvc0VT1FLi5kt2OZ JZoVJdnyWAGFHPYAACvonwZJd6homn32oXjXl1dxAmRjlyeVUfRQAAPQV/oQ /wDBP34seIPjj+yh8G/iP4o1mPXfEXinwpFq2p36JFCZ2kZyqlYwFGxdqYA/ horIiZoJ1c5G18MO4wcV1irFG8e1iXglyNw2kYPIJ/A19nLiKRW5yjYxjkfX 8qK9P1HRNMhaxv8Aw5aeI7eXyI7l47yCGeANtDM6PG+7bnJAKkgGu21/wlpG pWKSaTp/ia3+22aPNBeWtvdWwJT53jkjcvtyCRlMgVNc2EF0skDW8ximj2yB 0R4mBHI65xye3eivtzw3+2v8QtV/Zm1P9my501L7w1Z6wviVNXhLpc2LLIod JRjaUc4xkqVI715b4M8KXNtBrejJpCT6ZZXw1/8AtqLeklnsIQpICMFGJGM4 KkdDX5eftO/sa/DG5+GvxCu9P8F6RBPb3Nz47h16y3W1/bTqDJLHMu3Y8bsS Ryu3HQ0V/Wb/AMEDf+Cc/wCyx+3N/wAEvtC8Q/G0+KZtT8E/Gvxn4TvbHQtW h061aK4uLS7CXCSQSFxJFcopXoVBBGGav9EX/g16+NGhwf8ABJaw8Oa1/p6e B/jh4x8Jaho5jQo6Xt//AGqDJvyCkiagRsK44OSQxA/gV8P/APBfn9qP9ir4 OR/sq/A24m0ibwP8UvGV1qV9eLYz6TLa6prVzci1e1ns5XdhIZScuq7XKlTu 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 RQAFUAAArIb7o/3f8KyD91fx/nXzQQPLQ45IOT68iio6bUVFFFFFFFFFFFAJ ByCQfUcGiiiiiiiiiiiiiiiiiiiiiv/ZZW5kc3RyZWFtDQplbmRvYmoNCjEz IDAgb2JqDQo8PA0KL1R5cGUgL1hPYmplY3QNCi9TdWJ0eXBlIC9JbWFnZQ0K L05hbWUgL0ltMTMNCi9GaWx0ZXIgWy9EQ1REZWNvZGVdDQovV2lkdGggMjA5 DQovSGVpZ2h0IDIwOQ0KL0JpdHNQZXJDb21wb25lbnQgOA0KL0NvbG9yU3Bh Y2UgL0RldmljZUNNWUsgDQovTGVuZ3RoIDQ5MTU1DQo+Pg0Kc3RyZWFtDQr/ 2P/gABBKRklGAAEBAQBIAEgAAP/uAA5BZG9iZQBkAAAAAAD/2wBDAAEBAQEB AQEBAQEBAQEBAQIBAQEBAQIBAQECAgICAgICAgIDAwQDAwMDAwICAwQDAwQE BAQEAgMFBQQEBQQEBAT/wAAUCADRANEEQxEATREAWREASxEA/8QAHwAAAQUB AQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9 AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRol JicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqD hIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT 1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oADgRDAE0AWQBLAAA/AP8A P/r/AD/6/wA/+v8AP/oooooooooooooooooooooooooooooooooooooooooo oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooooooooooooopdxznPJopzrtYrnOO/SikoAJOBTm8xlDNyo6Hg e1FSj5hhs5HPpTsZHC9OSSakiaELh0LEc9cDrmigZBx0A6DGQfxpQFbOWC+g IyD+NNBjOSEAwM8sTxRRtIbAUg+vp+FN6Z688AnipYQodzt+Xjhjzg9aKXDL 1BbPUE4oHPH4daQqixsdvzN/CT8ygGimAg8Y+gLHFOHsw+hJApm8yEglUQ4y GPA/rRSkDkqcEDPFNYYPXPv60BhExGAytjBB6cf/AF6KjpKjkQofY9D60UpA HQ5/DFFMopKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK KKKKKKMH0ooooooooopSCMZBGemRjNFOIyTtBI+lFJRW5pPh/Vtcu4bHSbC8 1G8uHEUFrZWz3M0zHACqqAkk+gq1b2tzeTJBawS3E0jBEihjMjuTgAAD19K1 be1vL6ZIbSCWaWRtqRQxmR5D6AAH9KK+4fhl/wAE4P2nPiJbxald+EE8C6I6 h/7U8e3kfhvarDcGFs/+kOMc/LGeo9a9o8Pfs8/FHXY47ibw++g2LgEXfiKU aOqqwyGEb4kYY5yqnqPWvTtJ+DHjnVkF1c6cNKtSARNqrrZ8HpiM/OfwB/Wi vbIf2A/gZ4QZ7b4t/ti/DDw5qMA23Om+H0j1ydHBwyKJZ4WbHqE49K7lfgB4 F0ZD/wAJh8bvB+mzp8slpo6/2zMrZPGGeIn8AcV1A+EHhzT1I1z4g6BbSpw9 vBPG0oIPIAkdCceuMUV7B8Hv2Fv2HfjP4oXwF4E/aN8VeKvFv2KW/a30/Ror SCaOBC0zKzxlQAOfvHpWr4e+DnwO8TanHoehfE7WNX1NoXndIdGFtEyxIzyF WfjgDI57GnJ4H+Gc8gs9O17U9WvApeQ2bQiEgdeq/jnJoriPG37Iv7A+g+Id V8GS/tT6x4Z8S6PqDaXqCa14eF/bQTJw4JAhXA5+bdj3rKvvhj+z/HcXOnj4 uajpeoWdw1rOt9oDXEO9SQcEFBgY65xSTeBvhU5+zjxdeabeCTypor6ONjCe PUIMc9c9qK5W5/4Js+FfFiyv8EP2ofhD8Q5dpeCwuNRXSNQnAHCqI3mQNnjD sv1qs37Oum6uZB4K+LHgbxE5ybe2mvTp15OAOAFG9Q2eMMw+tQT/AAY0y6Dt 4c8baBquD8kRmxK/A4zHvXPPQkdKK+V/ir+w5+0h8JI7i/8AEvw41e80S3Uz N4g8NlPEmhqnUO9xbF1QYxw+DzXm3iv4I/EvwdHJc6t4Xvn0+MbjqenbdV01 R2LTRFlXI7MQa4fXfhR4z0JGuLrRbieyUb/tlhi9tcepZM7R064or5KurSa1 do5opIpEOHjkjKsvtg8ivKHVkYqylGHVWBBFecSwvESHVkZTgqykYoqoFJOO mOvtTaY6FCOcg9D60U2imUUuCegJ/Ciiikoooooooooooooooooooooooooo oooooooooqYggg5JA7Af596kPVih4xg8e3P9anOZMsW4QZAC9fX+tFOKtyRw BxgjijKqcjtxgjjPPep4xJ5bIBtI5G7tz/8AXoqS3tpriZIYkZ5GIVUVd7MT jgAUKGZgqAs54CgZz7CmJ5zybB1JAKqoPWiv0o+CP/BNz4m/EDwlL8UfiXf2 nwi+F9pYHV59c8SQ41S8tVUyGa2siVbaVXIeQopByCa9/wDAf7P/AIh8S6e3 iTxLdw+DfCdvB9sn1XVIyLiaEAsXgg4LAgcElQc8E16x4Y+F82qul1r1/HoG m7PPd5k33ZiGCWWPgAY6FiB1or4b+KkHw8svF2o6Z8M21e78LaaxsrPVtclR tQ1pkOGu2iRQsSyHJWPLEKASzE15F4oHhtNYuYPC326TR7YeRb3mospu78qc GZkUAIGPITLEDGSTXG+JIvDaa1Ja+FhenTLdPIjutRkWS5vip+aUqoAQN2Xn A5yaK8+s7KfUJ4ba1gkuLiZxHFHDGXkkYnAAA5JrnkieVlVAXdyFVEXLMa58 Ced0jQFmyEjjRQzNk0V+lXwb/YEuD4Zj+KX7S3imz+DHwxSNbyKPV3WHxXr0 ZAcC2tW+ZAy9CwLHIwjZr6K8HfAaWXTF8W/E/WIfAfhTas0Rvht1rVFI3AW9 ucHBA4J7EEKwr2Hwz8LYWs11rxnqUWg6QPnEUx2390OD8oIwoIPfJ9qK9G1z 9uP4JfAKzm8Lfsg/CLR9Pu4Izay/FHxhb/2h4iv2ClTNErHzAGIDYzGhP/LP FdFdfHLwd8P0fTPgx4PsrKaJDE/jDXYRea3cHG0vHn7m7720YXJ+5WvdfEnw t4UDWngHRYklRdh1i/TNw5AxlT945/4CPbGaK+B/if8AtQ/Hf4v3M83jn4k+ JtWtp3YnS0v3sNGQN1UWcRWLHbJXOOpNeDeJfiN428YTPL4h8S6pfrI5Y273 TR2akjnEKkIM9Mgd68t1rx74t8QB47/W76W2LEm1S4MNpg/9MlIU9epGaK8I Ml1K24ySHHbnFcRnOOSfrXKbpSyvvLE8lCpIBxRX6rf8Ehra+P7VdhKqSmP/ AIRLVQ0uwtH/AMercZr6R/ZZjz8VbEshkQaZeEjkKcW0mefpn8q9W+E9wtlr 011ckqg0+UBim7JIAwB/njNFcf8AEn9l/wAUfEX9p34v2Gu+K/B/wxtbLxhc Xd9qPj/XE0dxBO5kjlhtyfNlVlIIZFIzjkVz+ofDu98Q+PfFdvf6voXhOK01 aR7qbxJqSaeyq7sVKRHMjgjGCinqORUzeEW8TeJdTkn1rSdAtftW97jVrkwE KccpEMsw9wOvcUV41+0D8D/h78GtP0jVfh9+0T4P+KV5Nci3vNL8N+Zb6rps ijLSjazoYweN5ZTnoDWL458EeGvClraXnh34jaJ4slkl8qaz05ZLe9tnUZLY OQUHZtwJOcCm+OfBWg+E7G0v9F+IOi+I53mEMthp7kXsDAZ8zgsuwepIOe1F VPhN+3F+0X8HZrdPDvxE1jUtHhKo3h/xPM3iHR3QHOxY5SWjU9P3TKeTTfCP xo+I/g1kGleJb+W0XCnTtQkOoWDKOSojfO0H/YKn3rI8P/Fnxp4dkj+y61dX FtGQBa37teW4A7ANkqP90jrRX2Ba/Hr9kL9rRU0b4+eAbD4LfES8Hk2vxO8D W4g0e5mbID3sCqFIJxkygk/89RXrkPjr4O/FdUsfiB4bg8B+I5vkj8X+Gotl hI5J+a5txwRkjJPJP8Yr0RPF/wAP/H0Mlv4s0iLR9clwtvrOmqlrEzdMykAA g8Z3j/gQor5f/aI/Yh+IvwXtI/GOgT2nxH+Ft+PP0vx94UzfaesbnKLdou7y XII4PynnDN1rzT4ifBfxF4GjTVrSW38S+ErohrHxNoxN1ZOrcqsuM+WxH8Lc HsW61wvjD4Xa34bt4tUtjHq+iyrvhv7I+dHECM7ZQM7SQR3wexor4hdGjJVl wy/KVPWvGvYjOOvGCPavMmVPs+CoWSJsNk/eyfSivqn9mLwT8F/ip4lj+G3x O1nU/BGqeI5xb+FfHdpIlxplndPtWO1v7RwMxueFkR0IZsENkV6b8NtI8EeJ tRHhrxbfXnh641KTy9K8RwFZ7O1lPCx3UDYJRjwHRlIJ5DDp6R4A07wd4ieX RPEcl3pWpXjZ0nXLeVXthJwBDPCw5U9mVlIJwc5FFei/tO/8E/8A41fs3Qye I9S05PFngF2zbeM/DaPc6fEpOEF3HjfCxyPvDac/KTWv8SPgj4x+HMz3FxCm raIGHk65pYaazwenmZAZCfRgAexPWq/in4d6t4c8+4iZNR0+JsSXdmCwi9BI vVT+hHeivg/aycPwV7HtXjnKnnnb1BPSvPUCJGXKEMp25zkHpmimfOwzyQPy pvGPemDyyeE+XuxYjFFKNxbk9O4o5B4PI7g0ssYXBjBwOp79qKjpKr0UUUUU UUUUUUUUUUDGRk4GeT1xRVkrlcgZK9e1L0J7EVeBCpMYVLIcDcRtIxz0/Giv pL4N/s3+Kfin4c8YfEW/n/4Rj4XeANPbUvFfjC8hLwR7QSlpaR5Hn3MpAVIl IGWGSoOR6L4M+H954otdX1u7uF0fwt4ftGvNZ1uZN6IACUghXI8yaQjakYIy TyQOR3nhHwNf+JrO/wBWvLoaV4c0W3e61LVJF3nCqSIoUyN8jYAVARyeSOoK /Uf/AIJX/sT+G/Hep3vx9+JGki98H6Bqpt/Amj6qgNrq1zC4Z7u5TkPHB8oC n5Wk4J2qQ3vX7Ofwnsdcup/HesWZuNI06+8nQbG8UNDezoQ5kmXnckYKnH3W Y4PAIPQeDdCtrGNvEE1uLl2nMWjWtwA/IP8ArnUZB29AOm4c8UVZ/wCCsP7Z NtrOoy/s5fDjVo30TSpUk8f32nSgw3tymDHp4ZTysWFZx03YBzg1Z/aW+Lo1 R18B6FeLJbWjiTxJdW7/ALu7nXO2AEHlY+M44z1zineO/E0sED6Mk267uis2 qTB9zrkZEOc+4JH0HrRX4g+FfC2u+M/EGmeHvDmm3ms6zrN2llp9hYxG4ubq R2ChFUe5/rXyNp2n3eq3ttp9hbTXd5dyLBb29unmyzMxChQo7k/jXlNhYXOp 3kFpY281xc3DiOKOP5nlPpj9f1or9mdO+F3wl/4JyeBNH8f/ABY0XT/iL+0j 4msBqHhDwXKv2nRPBpI4nnblWeNiAXw2CMKM7XH1hYaJ4S/Z802213xdYW3i X4l31sLnRvD8w87TdAzkLNPzhnUjjOQD05AYe/afZ+F/hdp66jqkMGu+KpUE lvbD95aWLYPfplTwW59hyDRX5Z/G39oX4n/HvxRc+I/iD4hvNUZ5WNlpiSGD SdIQn5Yra3HyoAMDPLHHLGvnTxt4/wDFPj/VptX8TapcX8zsTDAX2Wlmp6JF H0UDjpz6k1434m8Xa34pvmutTuHZSxMMCEpbWwJ6Ivt+fvRXPfDX4O/Eb4v6 9a+Hfh94S1fxNqlxIqGLTrZpY4gSBvlkPyooyMsxAFZvhzwp4i8XahDpXh3S bzVb6dgiwWcJkPXG5j0AGeWPAqvonhnWPEVxHZ6TplxfTswy0KMyIM/xHoOv Wiv0i0T/AIJ8/C74SaXa+If2svjf4f8AAzmNZ38DeGLiPVvE0y4y0Zk5VX7D y0lX1r6FtfgJ4Y8J20N/8XPH2naA+0SN4c0dhqWssvOVZh8qMcAAqHHrXsFt 8J9B8PKJvHXiO1sHWMO2nWMqzXWcA7Sx4yR/dB6UVeHx9/4J0fCQC18Afs/a 38U9Stm2r4h8bXrC3u8AYJhdwhGQf+WIPNTf8J5+zt4TCxeHPh1qXiu6hOBq fiO9OybjjMIITGR/zz71Na+KvhH4eWRbXwzc65LkeXcXqK6rxyPmYDt/c70V 9x/sG/tufD74wfGSD4d+Ev2dPAnwnE2iXt8mu+F1tlv3S2iMgjdI7ONm3hQp G856816r8IPjLpfjPxhD4d0f4aeGPC7XFncSf2hotvDb3aiKJ5NrFIVYg7QC N3PvU+j+JdL8a6w9rpug2nh+NYJJM2iI5CoOBtWNTkjrz3orw345/wDBR/4V t8UPGPhf4g/sreAfGB0fVpdAufE169peeIL2O3JiRhLLaeYvygADzeB0NcJ4 l+P/AIZfXdUsvEPwk8Mau0Fw9hNfziObUpljJRT5rQ7wQOB83GBg1VT4gaDo N7daXrHhPTtYEUpgmu54opbpgMAFSyEjGB/F360V40fGv/BMj45Otrr/AIO8 afATX7pSo1TRriS+0XzG4DOhaZAq55CrHn171hf2v+zT4xWKC80HxD4A1CQE SXun3RvdO3k8FkYvwM9FC/1q0+p/BbxS6RT2F/4XnddnnwsWhZuAGIyygDnO AO1FeWeO/wDgnD4hv9IufF/7O3j7w38ePCqMZDa+HbmOHxPZp94CSz3MXOCB iNmbPasfXP2dtTuLGbWvhv4g0z4h6NFlpE0mULrFqOuHtSSxPoELH2rm9d+E oW1k1Twrrln4k05Tlo4WKXsQz3TnP4HtRXiNn+w3+0Hpn9max438BeJvAngu 7nK6j4t1PQbm4sNBjLBPPvI40MiRbioLFcc56A15+nwh8b2hsrvxBoWq+H9G uJds+sX2lz/ZtPXcF8yYKhZUyw5wevANcpp3w/1iSe1l1BW0rSZZQlxqckLT xWKk7Q8iLlgucc4NFanwK/az+Jf7MPivVPCS39p49+Gr3kuk+IfBeqsNS8Na 1bljHK9sHDBC65xgFWBG5T20vBHxW8TfDHUL7Sba6g1zw1NI1tqmhXgW90fU Yz8rsisCBuXoQMHjINa3hvx1rHgjUrjTWni1zQ47hrWexkfzrG5TOC0ecgbh z0we47gr6T+Pn7IPgv4zfDOT9qb9lGyuZPCc26fxz8OdpbUfCNwoJuDbLyzR Kc5TkqPmGVyF7rxv8L9C8W+Hf+Fm/CiKV9KbLeIvDHLXegSgbpDGDktEAc9y o56A42/GHhbQvEcX/CReCYpIoZ4/tF7o5PzWzYy/lj0Bz8vXjPSivyYRrrS7 tXUy2txbTZBw0c0bK35ggj6g18y/PG4JBjdGyMgqykHvXiatJazbhmJ4244K spB/xFFf1Mf8E4P2ttA/aQ+Fc3wP+KAstX8Z6Bov9lXllrAjuIPF2l7fLEpR hiRlXEcikE8gng1+iXwA+JFr4+8NyeENekhudc0qwNq9velZItbsiCpBU/fZ QQpBz1BOa+hdA8UT67pqvnzNUs7cQ6hA2GW9hACiQrjByMAjHX60V+W/7a/7 E/hT4DftC6VZT3t7ofwZ+J91JL4b1+2j+1/8IjNI4R4LhWOXjt3dTt3bvJdT uJBFfO/xS+FOj+CfHlpDdT3Nl4N8TyM+l6lEpmbSGL7WSVT94RMRkZyY2U5y cVy2qeEtFj1nTbq6nnsvD+uMY/tVqodtHmJx+8U/eVSAduQSp68Yor4c/aA/ Z68ffs7+MZvCvjG0D29zCL/QNfsQ0ujeIrR+Yrm1lI+YHPKnDKQQQCCK8s+I HgDXfh3rsuja1Erq6C50/UbYmSw1SBx+7mgfHzKfwIIIIBBA5bxf4P1Lwdqb adqYSe1lXzLHUbbP2W+jJG2SMkZwcjIOCO4orwE5GSv3T+NcIDj69j6VxACi fCfd7YOe1FMpKgooooooooopQxHAP6UqsVOVOPwzShiuQDjPXiikpKmSFs5b jBBx1zRXpXwr8A6v8TfiB4R8A6JAZtV8Wa/a6HZoOga4lSMMT/dG7JPoCe1b vh7RbvxJruk6DYpvu9Wv4rC2XoN0rqgJ9st1ra0fTJtW1Sy0+D5mvbhYVUfw 5IGSPTnOf8KK/er/AIKHeHdB/Z8/Zr+CX7Mvw7hj0+28Wa/bprRgCwz64tki STz3BHJaW5mt5CCcAIB0VRX2b8fbC08C/DvwT8MtCVUhv9QV7uSEKj6kYVUy SSY5JeSRGwTgbAOgAH0B4xvra38IaR4X0SIW0N5qkViI1G37UsSgu7nqS8jR sc+gHQCiszx7+1rqXh3wJ4P/AGPf2ONOuPE/i7TdCt/B2teM/D0DzWUEwQC9 ez4wzvK1w7Tn5V3MR8wOIPFPxQl0vSNF+Dfwehk1XU7Owj0W+1zSkaSOabaf tJteOS0hkYydskjnpb1u+t7W8h8HeCY113W7eCLSf7QtVMljZlF2ytEejMWL kv0Gcjmivx9/aK+FZ+GvxDtPhxLqkniTx9ZWUc3xBvobg30Q1e9bz2s4pBku Yo3hDuclpJJOuAa+YfiF4Yh8J6za+G/tf9o+ILa0V/E08UvnwxXk5L/Z0Yfe 8tDGGPOXZ+oANeQ+PPDkPh3WrTQorltR1qG0WTX51cywi7mO/wAiM/xBEKZY 9WZvQGiv0b+HWj+Ef+CdfwWt/iz440yw1z9pT4k6WV+H3hu/UPJ4KtJEz9qm TqjkMrM3XBCA5LKPd9F0/S/gD4MtfF+sQRXnxN8U2bN4b0ydSW8OW7gj7TIv aRgQfUAgdSwHqen2Fh8I/DQ1nWYI7jxdrVsV06ykOHsUdfvEDkH+8ffGcnFF W/hX8e/AP7e3gmX4D/tIXVhpHxZVppfhh8TkgitZJbiQlo7Sc8d/kCE7XBA4 YAl/hLxjoPxx0r/hAviTcW9p4ty58J+MWjjhYyNyttcHjIJ4XPByBwQCc3w3 r3h7x5pU3hzxMkVrq2Hk0zVI1VJHdvuhm6nBJ4JwQe1FeWeCP+CZXizwz4l8 V67+0TrVj8OPhJ4DufN1TxNLOjP4miX50XTh3Ei4G4/dyRgn5Ty+gfs9ana6 rqlx8Q7+Dwr4S8PzEahq8zBzqKryqWg/jLjHPbPQn5Th6L8L4o9SvW8T6jBp ukaY+ZZyfnvFHIEXHQjv2orP+K37e2g/D/QLj4TfsfeFLP4Z+DbVGsr7xq1q kvjDxIQCpm85gWUHqrPkjJwqcCpfE3x0stC0yTwj8HtHh8KaIgNvca6VEniH V+oLvL1GcnHpk4C5xWpr3xZtNIt5dA+HljBo2nIPJfUGhU310em4Ejv1Bbpk 9OKK/MnX/E/ibxdqlxq+vaxqeuapeSmS4vNQupLy5nYnkl2JPfp0r5xvL6+1 Gd7m9uri8uZnLyS3EjTSyMTzkk5714bfahqGp3T3Fzd3F5cyMWeWZ2kdj9Tz RXoPgL9n/wCM3xQk8vwP8O/FniLkBpdN0eaeBM9Cz7QAPcmt3RPA/i/xK23Q fDmsartxuaysJbgL7navA+tbGl+FfEetEQ6dpd7c5IIaO3ODkjnOOnTk0V+z n/BNj9if9oP4PfGy1+JPxF8F/wDCM+Hk8N39is95qltJeLLcW5jjVrVXMq7i RyVwK+sv2fvhD4+8G+O7HxJ4m0F9K0tdPuojNczxrLG0lvJGoaEN5gyWAyVw M16v4L8OeIPAmrf2nrFklsJbV4Askqs6bgMbkHzDkD86K+S/2mf+Cfn7U03x Q8feMNP+GWoa1omt+IbvVNOm0S+ttXuZoXcurmGJ2kXIwcMAa8n8Z/A34pTa 5q+rQeE769tb2/muLdtOZNRd1LEhikZZgD7gVha/8PfFur395rVlpT3NveTN PELaRLhwMZ+6pyKK/O7xd8MviD8P799P8XeEfEHhu8iwZLfV9LmspUz0BDrx XimreHtd0G5e01nSNQ0y5T/WW97aPbypn1Vhx+PrXm+oaFrGjybNQ069s5EH CzQGPP1yKK9D/Z/+O3jz4FfEXQfGHhbXL/T0stQibUtPEryafqtvvUywzw52 uGUHnGQQCPQ7Hgvxpr3gbXbLWdD1G4spYJVMsayN5FymQWSRM4YHHp6VoeG/ EGoaLeLJFdTJFIwS5t9xMMyHqGHQ/Xtiiv7Z/ht4l8P/ABd+G/h7xfYRWt9o vi/QIbzyZolmt2SeIb0eNh8wB8wMD1x0r9WNJ1+LxJo+l6rbNHPZa1p6zCKe PzYX80EPG6MMEAlwQeuOleq3d2be5a7gmM1rdospjO4pggdQeo659aK/Fr9q b/glcnjX9oDT/GHw6Gl+DvhPrytqvj2czxWcfhqaNszi1gJB2zKCy7RsQlhw FBPyz45/ZxOu+PbW/wBDez0bwtqKm88QTtJHBFojqSZBHFkEqwAZdo2qWIyo UE0JPC2neJdbs7mCSPT7GXa2pFML5XOGKr2z1z0GfaivFvil+394L/Zn1Hwp 8Ef2WdB0afwB4GvUj8aa1dWq3CeNplyl1Gj9WU/MTM33iABhQM4niX44aP8A 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 C5GTuF3Z5x74Bor6P/4Kba54y8Aftk/CTxR8MLZpfHl98OZdB0NIIDcXCy3j alp0RiUD5njF8zIf72M8V2Px71nVfDnxa8JeIfDMR/tm48KvZ6cETzpFe4a9 tFKADJdRMSpPO4Cuq1XW9Y0LxB4W1LRwk2qw6PcadY713mMTi4gUr6lPPZlJ 7gUV9JfAr9mnwH+xV8HPEv7R/wAdZ7bXfivLosmv6rqmpuLmbQZ5kLixsy2S 1zJI6o8o+YklQQNxPo/gHwDonwV8OX3xH8aSx3ni9LNtQnkuMStpckikrbwk 5zO7HDP16gEDcTt+H7GHw1Fd6vdNFdX0MX27V9UlKym3JIYxRZ53FjtJHJJx kUV+Sf7JFpfftOftzaf448WoLi1m8UXfxH15JCZLOCCyD3UNu57IPLghHsB6 181fCi3ufih8b7HWNXRZxNq8vifVQ4LwCO333Bjb/ZOxY/xHrXG+BhJ4z+Jo 1i/RXiF4+sXEbN+5RIsskZPpwiDv0or55/bO+KE3xY/aN+KHik3Bn08eIpdF 0gB90MNpYH7JEI8/wsYmk+shNcP8XfFMnjD4i+KtZaTdDJqb2toBykcMB8qM L7Hbn6tmuQ+IusSaz4v1eZ5GeKG5ezgO4MkaQkoAPYkE/jRX1l/wTf8ADeme DLD40/tN+IoIzp/wh8EzL4fnnxtGqXsciRlAeGKxpMMdQzofSvUv2drG10VP GnxQ1FFNv4J0J/7LLnCtfXKtHDtB64VZfcHb7V6B8GLOPS4fEnjO5jVotD0p 1tpH/gmcHDKp6kKG+n5UV+aXjbxTqnjjxdrnijWbp73Vdf1abUr64kbc8kk0 jOcZ+uB9BXznqupXesalf6rezNPeX9091cSs255GkYsT+ZrxXVb6fVdRur+d jJNc3DSytuzy7E4H+ewor9bPg0mn/scfsaa18c7qOO2+MPxrEvh3wAk8YF5p unDKyXUeeRk7jkY4QetfUfg6Vfg38I7/AMcGNY/GXjsPpXhqR0BmsbMZWa4T PILHIB4PyAjrXvfh+G38AfDy68RXKeV4g1zEOlBiVdIiPvr+RPGPun1or8p/ DreM/FXjKzuPD66xqvi/U9V+02jafvn1S4uWffvUrzuLHOa+XbU6lfajHLZm 6uNTmufNjeHMly8hOc8c5JNeHWsmoX2pLNbPcT6hNP54eNmMpfO4nPrnnNFf 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 2fwY8NeINOcf8Jh8SNGj0a8vEcC5VLAywXcpA6EyPIF9rgmtHxPqkUPhuDxV GxXVfF1lBbW3lna26FGjuZev8Lh1GMZMgz0or4N+LXwIuv2d/wBhbStb8UQN B8Qfj14z0261GGdM3WnaTbQy6jaWxJ5DOyRzyD1ESnBU1414j8Gv8PvgbaXW pIY/EPxE1u2nuYnUGW10+GN7m3jJ7GR/LlYf7EYPIIrH1XR18J/CS8MxX+2P E+s2gvsHLw26I9zFET/vIrsOmQoPIor2T/gm38Or34qfsu/tceCtEvrLTNX8 UWWn6NaX9+/kWVs0ltqIBmcdFHU9hXX/ALPOgXfiX4X/ABi0Wxmt7W71GCzt Iri7k8q3QtHen527DjqeBxUHw6eL/hCPFkAVBNqTrYRzMSiQGSGUFjjqBk8U V463/BKL4vi8IPj/AOF52yfMB4lhYnv/AHq4uP8AZl8WSbnPiDwioViDnW4e vXHWqb/BLXdpuIr/AEuUKvmlEukDkYz3P0or9Cf2kP2HvH3jj9mL9n34UaD4 w8F2T/DiCSTV5NS1JLLTtRnmSU+bbSk7WVTM44POc17Z4++EHiXXfh78NvB1 jq+hRPoEEr3gur5LW1nklMkgkikbCsoDkZHXrium1XSNU8QeHdH8JrLaWsek OrNJNPtilYLIoKn7v8RBweTRXzv+yh/wTV+Ivw/+PXw78c+I/FfgPUNL8JeJ bfXZ7PStcS61CZrdvNQRxgksQVB/GuO+Hf7Pfinwp468KeIr/VPDlzaaTrMO pyJZ6vHcXTGCQSYSMHJOUxgetc/pngHVvCOq2esNdWN1Jp13HcLDDPh8qQ2Q M5OOTxmivtnw1+yJ488H/treN/2nNZ1DwnqvhJYL+4sdP+3KdTtpJdMNvarI hP7shwpJbG0fNXpmjfDXxFD8cNb+I1/NpM+lma8uI4/tim4jaS1kSBWU8oQx TJYcYJro9N0vU9U8V3uuwm1mlvoZITErhnhJj2KT6HhTk9M5or0P9hL9tjxv +0Z8Q/jB4G8aaFpGmN4KumfSbjR2LBYobtrRoXbo3JVw3fB5Oah+FHxR174g 634o0fWrSzhbR1e4tZ7FSCipMIWjYk/MMupB9jzzXHwM15c66LiNRPplwyMq YwxVyhAI9+f60V+m9/fWmmWt3qV9MLexs7d7q5nc5jijjBd3J7gKCfwr2lmS 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 +JnhHxzfpofgP4+T6d8QfBmvJEsukWN48bQXkc8yjKo7Yl384Lr65H2Zb+Id G+EvxV8WaFq85tdA8dyQeIdB1FVWW1tZJC6v5jDopLMSwzgqvHcey+IY7TTN U1TSrm4FvFrEqapp8mA0IkOUkR36jjDA+49c0V+tHhHxf4Z8daJa6/4S13Tv EOk3oL2uoaXeJe2s4RyrqHUgHaSRj2r2+1vbW9t47zTr231XTJ93k3dpKs8L hWKsu4ehyMHHSuPutMuIIBceXmGU5SeNi8TEHnnp1orpX80oQhGRjr0ohFqs iSSZMZzgYO5Sf/r1QkLsXRMhuAT03cUVgeJdJi13QtT0m5IWDUNPmsJXCCTA ljMZbb9D+tTCGK4gurRXCLdW8lrJkBsCRGQ8fQ1f0q4e2uUWVfvERk43YDEZ NFfyUeBf2APFXxD/AGjfiX4dvdQj0b4Y/DrxVdDxV47KiLT0gWRphHAxO1pC hwQpwuCTwCa/Pbwt8GNS8UePNe0aW5Sy8PeHdSmXW/EDYW0t442YkK3QsQDg A8YJ6AmodN+Hw1TxRqIku0TRrG7LXF9EQQ6k7tqepAPOOmKK++9P/wCCj/7O /wAPNat/2ZLLwzJffAPSdEfwTceL47iSa6mdt0c8hj43QsXkJYAMCSQQOK9p tvjl8PNF1OP4dwaM0nw5trN9Dn1YTNJfXDNuEkxHAKMWY9A3zcEdK6XUvFXh a11WTQ7cNNo0EK2cF1nAVgfmye6n5ueDnv2or5x+LX/BL2y+JFjcfEr9kvxv onjnwjqrNe2/h651BEvLEMA3kw3B4OM4COAwz0rl/Ff7NMeqwDxB8JtfsfFG i3IaVbF7hI7y14B2bjgHrgA4bn7tZOufDiy1NpNQ8N3sRtZQJES4k/djOMhZ Px4B55oqz+yV8G739iK41r4/fHuPxJ4Q8XaPLP4f8A+A7azFxceO3lt3EqoV 3HaP3YzjBD8Amsz4a+HE+ElxeeN/H/8Aa2i6rp0kll4f8PJaHzvEbvCyyAN2 RQyZboQ4xVjwnoNv4UsNS1bWbu5tdSYmwsrCCMS/2gjr82Op7KOnQ+tFevab /wAFmvHGh3uo6d4++B3kTzXW7R7azu7jSr5Lck7FmWZTvONnKjB568V0tr+1 Xq1tdz/274JtJA8260t7eSWxkWPJ2h9+7dxt7c5PtjGh8R6fZvJb6voV5HI0 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 De+FNe03xBp8dtLeaXcrdQJeW6XVs5Ug4ZGGD0/+uK29A8RXPh/V7HWbOG3N xp0okSO4iWaGTn+IEfUdsdsGivoP9q39tD4lftVa1pkuvqnh3wzo1osOl+Ed Lunk0u3lKgTXDE43u7ZO5vurgDpmu5+Kfxc174p6lb3OoQxaXptnCI7PR7KR ms4GIHmPyfmZiM5bnAA7V0njjx/e+NLtZ2to9NslQeXp1vMZEL9GdmOM5569 BgUV8bZO4kkgZwMjINeTYOcLkgnHTrXn6HzInVmACcqSM7snpRUVNqF5N+3I xj360UoJHQ0oJHQ0+IyEgA/KvXgGirttcS2U0dxbytHNC4kjkRtjIQcggg8E GnqxjZWU4dTuVgcEfjmrKPht8eY5oyCGDdR1/Oiv0Sf/AIKN/FW9/ZtvfgFr 2k6T4lmuYBpUHjTXX/tHULXTsAi1EDqUaVSFCXDHcoyAM4I9/T9oTxM3wzuf h1e2NjqUk+LZNf1D/S7qG0Az5CxsCu4EDbKfmA4HYj1S3+LF9beFr3QptMtr rUbqH7H/AGvdN5rJb45TySMF/SQnIyeO9FfnO8hd2JGOc5U4Ar5+wW3YAwvJ I4ryQlCxYsHwd2FBX9f89KKQsw5ySP8AewBTaayPgucouMgZyfTFFJvYD+Jl 9S1L8vPB9vm/+tQQP4t0WRxzvz/hRTSQCTnce3oKXBGMgkDt0xTGkZgQWznH QAAYoqOm1HRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRSgkdCR9DiiiikooooooooooooooooooooooycYycenaiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiv/9llbmRzdHJlYW0NCmVuZG9iag0KMjIgMCBvYmoNCjw8 DQovVHlwZSAvWE9iamVjdA0KL1N1YnR5cGUgL0ltYWdlDQovTmFtZSAvSW0y Mg0KL0ZpbHRlciBbL0RDVERlY29kZV0NCi9XaWR0aCAyNjANCi9IZWlnaHQg MTY3DQovQml0c1BlckNvbXBvbmVudCA4DQovQ29sb3JTcGFjZSAvRGV2aWNl Q01ZSyANCi9MZW5ndGggOTkwOTkNCj4+DQpzdHJlYW0NCv/Y/+AAEEpGSUYA AQEBASwBLAAA/+4ADkFkb2JlAGQAAAAAAP/bAEMAAQEBAQEBAQEBAQEBAQEB AgEBAQEBAgEBAQICAgICAgICAgMDBAMDAwMDAgIDBAMDBAQEBAQCAwUFBAQF BAQEBP/AABQIAKcBBARDEQBNEQBZEQBLEQD/xAAfAAABBQEBAQEBAQAAAAAA AAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiEx QQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4 OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOU lZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj 5OXm5+jp6vHy8/T19vf4+fr/2gAOBEMATQBZAEsAAD8A/vQr+2aS62YYkdeT 0r+WS78YiLMlvMq8/JDsKk9M/MU+pr+EibV9hDK6rzwuMZ/EiiqxvYzuHGCM DANcjd+I55g6QKtsrKVJVRKW6Y6j6/nWRLqhbeqARgjGVAYH07fWjpVd5n5I 5A5HbNcnNqqRuY2lACHdjyyccA9uPSsl7wg7S/3TkDbTd6+vbOapySLlmZ+e pO3ArLbWlO6R4cL1ZvM4HPpiqjXJZixTknJ+ammVR0IP44qDzohgBgfxximy +IopXMjgO7feO8r0GB/DQbksSSuSff8A+tTDMCeDjj0zTWvUUgLgcZ5NYFxq CySby/mMw+Y42dMAdvb9KrkliSTkmmGU8jqPr1qo92MEZUr3GdxNNm1eWXAk w4XOMuD1/CgszYyScdM1GWJ/+tVOa8UFlLj7nO3qDWPNdlmYkg5XkjikpCxO D1x0ql9sUsjxnJHIUITn86jmvpJdj7vMZOVXaFznGe1FJVV9SIUqeR6Btzdf XFVmuzjH9cmiml19c1QudRikV4mjBHf5j/hVCTUoiSNwwDnGw5P6UVEZPmC9 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 kkluBbrFEoiVmmkO2PAUOVAA4r7h8J/E6++Gnhe38I/DzStF8CaHZTXM9np/ hXQINDs7FryV5rjykhRFiVnmc7Y8BdxVQFG2u6sf2lPjbpPhabwVo3j/AFrQ /DMzvI2k6HKNItk81neQIIgpUMZHyFwMMRjHFPEsijarsoPZTjr1r1mLWLy4 lhDRmCNJFAWNPLjADDoo4GK4zU/G/iTWLu3uby5u7p3nBeaVWcFVbljn/PNe L3l9e6ldSXmoXdze3U775rm6maeeUnqWYkkmmV+cv7ZPxJ+J3w2/Zw0bXvhJ 8Qta+GniqH4/fFnxAut6MLe5XU4/DPhn41eNodOvrSdHtrm0uLvw1YCWC4jd CUU7NyqR8E/F/wAaePPD3wT0u7+Hnj3Wvh54ij+PHxS8Q3OqaPdKBq0Hh+3+ K3i6LTr61kBgurW4u9CsPMt7lJIy8cZMZZFr0Twh4bi8QW+sO8xtUsYLm8Nw UEgb7Npup36xFcYIkazReemc0oGfyJ/Kv5u/2gv+C4X/AAUL/Y/+L3hy3l+O 3wS/af8AC+t+EHuV0HW/g7a6V4EvpyY7ebVtN1LS7LSrq+s0u4NQtbO9tr3y Lg2Fyz2oTyHk+I/i5+2Z+1V8C/FOhW198bfhv8e9G13w81+dPufhxBpfhK7k Ki3kvbG9srPT5rq0S6jvILa7trnyp206YtD5flGTu/Fng3RfhXqmhm5PhH4h 2+p6a97Gn2bUbXSrngQvNBNH9nM9us63MMU8UpWR7KUlduwupAUj7rgj3AP+ f6V7n+zb/wAHIP7QPxS+J/w58K/FL4RfAO08OeKdN12/8QP4A0PX9D8Qp/Z2 havqlolnPeateQJmSxtlk8yCTcpkClGZXX9Qf+CLfxq+Iv7f37cvwV/Zv+Lv hn4Y6T8PfiJbeIrrxBqPg/RtXsvFFmmj+Ftb1u1W0mudRuIF3T6ZbI/mQvlG cKVYq4+p/wDgnp+xdB/wUK/bK+D37MGj/wBk+Ah8XX1x/wC19Pa7n/sWPR/D esa/IyLNLLnK6UVwwOd4G5c7hc0+3gu7tIbmZraAxyyPLHH5rr5cTyABSRnc VC8nvX1DL/wcQ/DXTJbyDXPh9Zs9vcSxQPBesjSKshSINxtPGMsDg8EAK3y/ 2Xaz/wAEMPgvqE8z2HxJ1fTrdnbyYX8MRXTxpn5VZ/tC7jtADNgA8kBc4H9M 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 K57vGzJuX+ddwlzfWryQ6a8dokzCe4O1ZnY4O5kYrkfzqJlvZEuZoWWOJPLk mY4ZucgFcjI/Dmiuxs9O8T+KjZ6VDqNzZT3UZ1DTruC+ME0jFlDKSvTOf4qf HoupaleW1sbmaK4lDXtlcpcmOVichgSOmc9/StCz0uS+haF5HinZRPayJKVb JZcg46Z9/Wit+8/ZB8R+KJv7Y1VLPUby4RVe8uNSXz5wowC/PWte6+Euo63K L+/ihu7hkERuJLsCSQJwC3HWuqXwdrFwPOmWKZ3x+9eZd7gALk/lRX//2WVu ZHN0cmVhbQ0KZW5kb2JqDQoyMyAwIG9iag0KPDwNCi9UeXBlIC9YT2JqZWN0 DQovU3VidHlwZSAvSW1hZ2UNCi9OYW1lIC9JbTIzDQovRmlsdGVyIFsvRENU RGVjb2RlXQ0KL1dpZHRoIDI1MA0KL0hlaWdodCAxNjYNCi9CaXRzUGVyQ29t cG9uZW50IDgNCi9Db2xvclNwYWNlIC9EZXZpY2VDTVlLIA0KL0xlbmd0aCA1 MzgyOQ0KPj4NCnN0cmVhbQ0K/9j/4AAQSkZJRgABAQEASABIAAD/7gAOQWRv YmUAZAAAAAAA/9sAQwABAQEBAQEBAQEBAQEBAQECAQEBAQECAQEBAgICAgIC AgICAwMEAwMDAwMCAgMEAwMEBAQEBAIDBQUEBAUEBAQE/8AAFAgApgD6BEMR AE0RAFkRAEsRAP/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//E ALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNC scEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldY WVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqy s7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5 +v/aAA4EQwBNAFkASwAAPwD+xr9ob9pv4Cfso+Abn4o/tFfE/wAOfCjwHbSt bN4k8TvKlnNcCKSWO1hEaMzzyiNljiUbpHIVQWIU/wBSXx0/aN/Z5/ZV8Dt8 T/2l/inoXwo8DefNZ2usa9FcTQ6lcwwG4FpbiGNy00ijbHHwZHZVXJIFfwCQ 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 Dyy+Hfwn8L/GbVviPes62kPh+40bW7G6iW3uJLqN3vbYwzWot/OZ3hjlhk2N E1E6TdpqEX2Y3VnIs9sl7psGrWkjB1+WSCZHjI75ZWGFIKndUkUhicSLt3ow dN8ayoSCDgqQQfoeOo71+bn/AAQa+BX/AAUR+AvwW8Y/C79vf4gfErT7r4Ta 1L4P+F3wP1jwd4OvPh5Z6Vqky6//AMJDY+OrC3l1HWZmuLrUbX7K1/5VghaN 4W3Wotvzw/4IR/BT/goR8A/gX47+EX7eHjb4peH4vg1qcvg74UfAXXPh74Pm +HcOna5O3iJvENh4+sraXUtbn+1XOo25s/7Q8mwVvLkjbdbJbF3fRz2UFqFW NbIGK3RbGKGUq7PIxknA8x8M7DaxOAVwcKFCFiVCtj5BtUBQCOSeT+J/T0Ff vtkZGCAe4zzX7fS2d86NIVlaFMOSQQnsf0NY+D6H8qZX88//AAcp698PvCf7 BHhvWfiV4wtvBei6p8cbDwdpOoz6Tf6yb3Ub3Q9dvYrVYrS3nkBMGmXsm9lC DySCwJUHK+Lf7av7M/7DPwi0f4sftW/FCy+EXw88ReO7T4b6R4k1Dw9q/iS3 utZu9O1PUrezMOnWtzMpe20rUJfMdBGPIKlwzIrfuj/wQC/ax+DP7FP7b3hb 49ftC+LT4E+EOmynwv4j8WDQNT8TDSZtQ0rW/sjNZ6fbXF04ZoHUmOJtuRnA rUskQ2d+8jrFGxjtxIwJAdt8ijABPPksM+4r/O5m1f8AZ3kkcr8ctLSNnLbD 4E8Udznn/iV/5xXymP8Ag4h/4I0Hp+3D4M/H4b+Oh/7hK/0Kov8Ag5E/4Isy KhX9tXSR8o4PwW+JK+n/AFL3vVHy4/8An4j/AO+H/wDiai/tP9nb/ouOlf8A hB+KP/lX/nFL/wAREH/BGn/o+DwZ/wCG38df/KSpP+IkL/gi0f8Am9TSOe// AApb4k98f9S970eXH/z8R/8AfD//ABNM/tH9ncnP/C89KHOf+RE8U47f9Qz2 /nR/xEQf8Eaf+j4PBv8A4bfx1/8AKT2p/wDxEff8EW/+j2dG/wDDKfEn/wCZ 6jy4/wDn4j/74f8A+JoGofs78f8AF89L/HwJ4p9v+oZ7fz9aX/iIf/4I1f8A R8Hgz/w3Hjn/AOUntS/8RHv/AARc/wCj2dF/8Mr8SP8A5nqPLj/5+I/++H/+ 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 lf8Azmjfb/8APGX/AL/j/wCJo/4ak+EP/Rv+qf8Ah00/+U1H/Eat8D/+jH/H f/h9LL/5RUf8RrfgH/pH94j/APEl7b2/6lf/ADmjfb/88Zf+/wCP/iaP+GpP hD/0b/qn/h00/wDlNR/xGrfA/wD6Mf8AHf8A4fSy/wDlFR/xGt+Af+kf3iP/ AMSXtvb/AKlf/OaN9v8A88Zf+/4/+Jo/4ak+EP8A0b/qn/h00/8AlNR/xGrf A/8A6Mf8d/8Ah9LL/wCUVH/Ea34B/wCkf3iP/wASXtvb/qV/85o32/8Azxl/ 7/j/AOJo/wCGpPhD/wBG/wCqf+HTT/5TUf8AEat8D/8Aox/x3/4fSy/+UVH/ ABGt+Af+kf3iP/xJe29v+pX/AM5o32//ADxl/wC/4/8AiaP+GpPhD/0b/qn/ AIdNP/lNR/xGrfA//ox/x3/4fSy/+UVH/Ea34B/6R/eI/wDxJe29v+pX/wA5 o32//PGX/v8Aj/4mj/hqT4Q/9G/6p/4dNP8A5TUf8Rq3wP8A+jH/AB3/AOH0 sv8A5RUf8RrfgH/pH94j/wDEl7b2/wCpX/zmjfb/APPGX/v+P/iaP+GpPhD/ ANG/6p/4dNP/AJTUf8Rq3wP/AOjH/Hf/AIfSy/8AlFR/xGt+Af8ApH94j/8A El7b2/6lf/OaN9v/AM8Zf+/4/wDiaP8AhqT4Q/8ARv8Aqn/h00/+U1H/ABGr fA//AKMf8d/+H0sv/lFR/wARrfgH/pH94j/8SXtvb/qV/wDOaN9v/wA8Zf8A v+P/AImj/hqT4Q/9G/6p/wCHTT/5TUf8Rq3wP/6Mf8d/+H0sv/lFR/xGt+Af +kf3iP8A8SXtvb/qV/8AOaN9v/zxl/7/AI/+Jo/4ak+EP/Rv+qf+HTT/AOU1 H/Eat8D/APox/wAd/wDh9LL/AOUVH/Ea34B/6R/eI/8AxJe29v8AqV/85o32 /wDzxl/7/j/4mj/hqT4Q/wDRv+qf+HTT/wCU1H/Eat8D/wDox/x3/wCH0sv/ AJRUf8RrfgH/AKR/eI//ABJe29v+pX/zmjfb/wDPGX/v+P8A4mj/AIak+EP/ AEb/AKp/4dNP/lNR/wARq3wP/wCjH/Hf/h9LL/5RUf8AEa34B/6R/eI//El7 b2/6lf8Azmjfb/8APGX/AL/j/wCJo/4ak+EP/Rv+qf8Ah00/+U1H/Eat8D/+ jH/Hf/h9LL/5RUf8RrfgH/pH94j/APEl7b2/6lf/ADmjfb/88Zf+/wCP/iaP +GpPhD/0b/qn/h00/wDlNR/xGrfA/wD6Mf8AHf8A4fSy/wDlFR/xGt+Af+kf 3iP/AMSXtvb/AKlf/OaN9v8A88Zf+/4/+Jo/4ak+EP8A0b/qn/h00/8AlNR/ xGrfA/8A6Mf8d/8Ah9LL/wCUVH/Ea34B/wCkf3iP/wASXtvb/qV/85o32/8A zxl/7/j/AOJo/wCGpPhD/wBG/wCqf+HTT/5TUf8AEat8D/8Aox/x3/4fSy/+ UVH/ABGt+Af+kf3iP/xJe29v+pX/AM5o32//ADxl/wC/4/8AiaP+GpPhD/0b /qn/AIdNP/lNR/xGrfA//ox/x3/4fSy/+UVH/Ea34B/6R/eI/wDxJe29v+pX /wA5o32//PGX/v8Aj/4mj/hqT4Q/9G/6p/4dNP8A5TUf8Rq3wP8A+jH/AB3/ AOH0sv8A5RUf8RrfgH/pH94j/wDEl7b2/wCpX/zmjfb/APPGX/v+P/iaP+Gp PhD/ANG/6p/4dNP/AJTUf8Rq3wP/AOjH/Hf/AIfSy/8AlFR/xGt+Af8ApH94 j/8AEl7b2/6lf/OaN9v/AM8Zf+/4/wDiaP8AhqT4Q/8ARv8Aqn/h00/+U1H/ ABGrfA//AKMf8d/+H0sv/lFR/wARrfgH/pH94j/8SXtvb/qV/wDOaN9v/wA8 Zf8Av+P/AImj/hqT4Q/9G/6p/wCHTT/5TUf8Rq3wP/6Mf8d/+H0sv/lFR/xG t+Af+kf3iP8A8SXtvb/qV/8AOaN9v/zxl/7/AI/+Jo/4ak+EP/Rv+qf+HTT/ AOU1H/Eat8D/APox/wAd/wDh9LL/AOUVH/Ea34B/6R/eI/8AxJe29v8AqV/8 5o32/wDzxl/7/j/4mj/hqT4Q/wDRv+qf+HTT/wCU1H/Eat8D/wDox/x3/wCH 0sv/AJRUf8RrfgH/AKR/eI//ABJe29v+pX/zmjfb/wDPGX/v+P8A4mj/AIak +EP/AEb/AKp/4dNP/lNR/wARq3wP/wCjH/Hf/h9LL/5RUf8AEa34B/6R/eI/ /El7b2/6lf8Azmjfb/8APGX/AL/j/wCJo/4ak+EP/Rv+qf8Ah00/+U1H/Eat 8D/+jH/Hf/h9LL/5RUf8RrfgH/pH94j/APEl7b2/6lf/ADmjfb/88Zf+/wCP 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 8J/hTv8AhPvCv/RJPgr/AOGl0H/5Eo/4Yg/Yu/6NE/Zf/wDDA+E//kCkH/BO /wD4J/DH/GDv7IXH/VtXgvtj/qHewo89v7kP/fhP8KP+E+8K/wDRJPgr/wCG l0H/AORKT/hh/wDYt/6ND/Zf/wDDAeE//kClH/BPL9gAAAfsO/sh4AwP+Ma/ Bn/yuo89v7kP/fhP8K8pr6ir7BqGiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiv//ZZW5kc3RyZWFtDQplbmRvYmoN CjI0IDAgb2JqDQo8PA0KL1R5cGUgL1hPYmplY3QNCi9TdWJ0eXBlIC9JbWFn ZQ0KL05hbWUgL0ltMjQNCi9GaWx0ZXIgWy9EQ1REZWNvZGVdDQovV2lkdGgg MjE3DQovSGVpZ2h0IDE1OQ0KL0JpdHNQZXJDb21wb25lbnQgOA0KL0NvbG9y U3BhY2UgL0RldmljZUNNWUsgDQovTGVuZ3RoIDU5NDk1DQo+Pg0Kc3RyZWFt DQr/2P/gABBKRklGAAEBAQBIAEgAAP/uAA5BZG9iZQBkAAAAAAD/2wBDAAEB AQEBAQEBAQEBAQEBAQIBAQEBAQIBAQECAgICAgICAgIDAwQDAwMDAwICAwQD AwQEBAQEAgMFBQQEBQQEBAT/wAAUCACfANkEQxEATREAWREASxEA/8QAHwAA AQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcY GRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4 eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJ ytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oADgRDAE0AWQBLAAA/ AP6OtW8ZfGZJJFFrqdxCCAsY01isjYIPA6Dp2r1fxH8Q/wBobTtQjhtNI1u7 s1YoLddKZopH2sGyAPlHToPSv4AWdmyWYknkk8k1/n/1n2fxN+LKZMmj61C4 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 R/Evgf4Q2WtaB4x0e08QeHNR803EVxb30UVyDEnJZN038IO3I/H9W/DPxE8I 67Do/if4ffADSvEOjeMtLtdd8OahLdy3ivDexxXJEMfzM0YaZhhVOPl9fm8X /bL/AGRfiN+zB8dPGngDU/BXiex8Nx3w1XwZql1pFwtnrGlXcaXVpNBKy4kU RzICwJ6de9T6jp8+nzIssFxDDcwreWLzxGP7TBIN0Uik8EEdxxkEdq6jRviJ 4pEs1vp3wq8G2LQmSNGu7VVlihDbUnYleM7fuN3OK9p8K/GPxej3NlonwE+F 2nzwCWONr7Rk8+3gDbUui7Dvt+4/c4r42ZWVirKVZTgqwwwPuKz66G3+I/xk 1e7W20jR9Dt7aOUQmSCyCYBOM4XAIGD37101t8av2nfEl4NO8NaF4WsbeKYW wl07RUt1VWYgEqgCsq4P8Xekz/npRXW22g/F/V/Lj1DxM1qk0xaVLSBbfy19 FA4GB/OvRdN8FftM+KI4bTW/G1zYJc3LPPHYQLYrEh7AL8q7RQBngUVrxfBz Vb58av4j1G/Zj8yyTNIrZ7Y9q7Wx/ZW8Saspj8UeMtV1Z2O5lmuXnD7udu3/ AGf6U7Y3sPqaK7PT/hJbaekUa3V5KITxCZN6nv3GRmvTtC/ZUt9O8i3h1DVb hrd1DWqFp1OSSfvDcu71qRY26YJPoBnrRXWQ+E/LbaPP8vptIJYkD1wPbpXr dp8GJLcsBBfiBAFKvExJIX+9tX/Z+760vlOP74HU8UVow+Hb5FdoCYQXyxdV cNjgjnnB+tbOlfB/xFbi4uNMie1QS75XuIlcSKuRt+b5sHPrUywuwJAxj+9x RW1aabqaspLRGIKASflJPGSDnPrXq2gfDvxfIYpVFsbYIMO7mFnbjcyPu3f3 q07KKaM5P+rx6d+Oh/Oiuw0q0u1V1kfIdgy8hwvGD+fpXungbwz4stTJa3d3 +5llWWL96LpIsLg4Zv73Hy16n4Qsp5bedCQkU0iGLdtYAjr1PfipYwTwO545 rY+xSf8APU/+O16R/wAItrf/AD+t/wB9R/4V3H9hxf8APeX/AL7i/wAam8tv Qf8AfQr5u0/4H+DphPJ4U1VtNnncuHmtlaSMg9ASCCOfWvzvtf8Agnx8K9RS 7uPhf4zOiX11KXibVNLUywsD90OAVPJ68E8cV9Y/Hv8A4JA/tOfBO4uZrU6B 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 V/hR44vpTCZbW7uwUfz7dtikDbwJM9x2/H0/z+f2wv2fNd+A/wASNX0TVUJR LrEE32iCUvEQNm4RyNhhuCnHUjPQ8Sng10xHX2OK+CJlzG65+ZCFJK5ww9vz r4/qKRmRSwPTqDWDrF5JZQvMj7iE3BSMAfpXk3jvW7/RojLZ3gd5EBjiaHak ee/T8aaxIAwKri7AOCAT9CM15/D8TrQXZsZrdzMpwqoCfM+Xdxnjt3rz23+K WtR+Wt1Z2lzt7q8kG7PqMlT+IpnmHuB/KnvFFcqQwxuUg/yrU1TTtL8UWc1t coWW6jKMxTEqgdR6etZcy6f4jm82NpIr2cFneRDvYKBwQDs9e+elBO9s9M/j XmnifwmxUXFuYwFztDYy56YPtxXwH8cf2fLnSYzq+lzWptImLQxyYWWVm+VV b/ZHFcvquh3emSBZVUBh8pDhtw556+1NKkda8mG+GV45FZTDJhlWQL0I6EV8 VzQ/YrnyZopI3tLjbKkcoX7rc4I4rDpK7KzvCkcMbtIgY5KSSm5YhiOrYHYi vZvC+opb2tmjPcQxzSFzDcXB1B3VmOQz4X+Ej1qWJm3ooJALYIznr1orp9KB MgUNsDyZRmyx78kD14r1zQbY3d/FaxTC1FzeKltPKDIQ2W+ZlX1+X8q6K1Uo yjcF3MAC2epOM8fWiuh+wXf/AD2P5ivR/wDhXHin/oML/wB9f/Xq19mu/Qf9 9L/hRX//2WVuZHN0cmVhbQ0KZW5kb2JqDQoyNSAwIG9iag0KPDwNCi9UeXBl IC9YT2JqZWN0DQovU3VidHlwZSAvSW1hZ2UNCi9OYW1lIC9JbTI1DQovRmls dGVyIFsvRENURGVjb2RlXQ0KL1dpZHRoIDEzNA0KL0hlaWdodCAxNjYNCi9C aXRzUGVyQ29tcG9uZW50IDgNCi9Db2xvclNwYWNlIC9EZXZpY2VDTVlLIA0K L0xlbmd0aCA1NTU5Ng0KPj4NCnN0cmVhbQ0K/9j/4AAQSkZJRgABAQEAZABk AAD/7gAOQWRvYmUAZAAAAAAA/9sAQwABAQEBAQEBAQEBAQEBAQECAQEBAQEC AQEBAgICAgICAgICAwMEAwMDAwMCAgMEAwMEBAQEBAIDBQUEBAUEBAQE/8AA FAgApgCGBEMRAE0RAFkRAEsRAP/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgME BQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQci cRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZH SElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqi o6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq 8fLz9PX29/j5+v/aAA4EQwBNAFkASwAAPwD+C10LDGCfb1/ziv4GMH0P5V/A +QCOoPtzX+f/AE1LZwCcHkZCn7xqRVwC3TA+6epqMx9SD07dzRWiqlFKGM7i OucCrAj+ViynOPlOcCpgpAAIO7HJ6Ciq7qc44VQxBJbk0wQSSFQqkndjA6mk 24JA7ntyaK9y+EP7Nvx0+Okep3/wt+GfibxTo2jIx1nxRFZrYeE9HKKGZLrV ZylojhSG8syeYRkhTg19ifs6/sA/td/tXafq2u/Av4D+PvHPhPw7E8viLxxa 6UdO8CaCEAZ1u9buDHYpIF+byvN8wjkIa+mfgr+xp+1F+0LofiHxZ8Hfgl4/ 8a+CvCkTTeKvHlhoMlv4E8NhE3Mt9rUoSyik24YRNL5jDkKatQWN5cw3Nxb2 lxPb2ah7ueKFnhtQx2qZHAwoJ4G4jJr6df8A4J1eP9DtY7zx34/8HeH5ngEn 9m6FBd+KdThbcgMUgKQQhl3clJHUbevK5+qL7/gkT8Y/CMEVx8SfHvgnwzOY C8ukaHBe+KtVtnDIGilzHbwbl3ncUldRt68rnsb79i3xn4bjebxp4r8OaNJF ErTWOkw3HiC+gcsg8txtijyMnJV2A29eRmExkdSPcDkiuIi/Zc+HkfiHWNF1 X4peIFOneE5tftbqDwdaRjUZ4Lq2t3t1jbUOF/fu+/JJEf3Rkkfa/wDwTk/4 IeeCf21/jRrXwm1X4+eKPBw0fwRceK4tU0/4f2N4dUmtryztXt445NRGF/0p n35JIQfKMkj7e/4J7/8ABLDwL+2v8ctR+C178c9e8E3lv4KufFGn6pb+ALTV v7SntbqygktVgfUo8DbdSSBwzEiH7oySrQF+bLEYGRhc5Pp1rxTXfA/wo0yS 6ih8V+J5ZYD5cckmk2qpK3RiwEuQMg8ZPYZ71+7l5/wZ6fAWKFUT9qX4pSXC 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 z4TXmtxr4jsBay33jvXhaNCJNU8QXMJjMNvcG7Q21ojl0SLdEiDebj9HtE/Z 6sfBXwx0nxzquk6lpXwyu9Vjh1Oyjje68Xaots0CvqGsSxmMwQT/AGqNre3V iwVA0YUb2mufZXW2S6YDyXlaMqvzSLtCnL+gO7jnnafx/Cv9tZfBeseLNXk+ Hmj31p4fvdWjt/DVlLYLbSusWUklht49xRJAm/aSXPmKWJNfml+0ingy+8Ta rN4Es7yDQ7m/SLRbWazEEzLGCkkkcCFiiPs3BSS37wbiTXwD+0Evh3UNZ1D/ AIRHTrmDSri+ji0W3ktVhlZY12s8cKZ2q+0tg/MdwJJNU2xuO3pnjPWp/gX4 0+Jn7P1xovj7xHo6W2leJLAeFtdt7q+WeK9tRFGNH1ifyWcr5LSpA7lSxjUf KzSM1c/4YsfFHgqPSPFus6fHFZarF/Y2owz3KypcQmNPsGozeWWKhGkWNiRu KKOCzk1x9joviHwvp+ka94l0xILTVkGl3iz3ayieELGbK+k8tmKhS4jYkZKo OCWNJX2Fd/Cqb4tQ/DrxpdaR8Tfiz8CtZ8X31j8Q/EPwbn0weINL1i3vfsF2 LomxvT544vLS0uEht2snsjHOTOi2v1lZfCu28VaL8P8AWbrSfH3xE+EWqeI7 uz8a6v8ACyWwGu2GqW90bO5W4f7HdnzgNtzb206RQtayWpSYmZRb/Sdr8NLT V9L8Gas2neMfGXwuvdcnsvFGq/DqWz/tOwv4JxaTpMxtrj96OLmCCZY4mt3t 2WUmVfJlWPhHZXaInDGPqPbPr3xX2P4Y/wCCffwc8O/Hr4CabcftHeJfi1+x P8QPhfe/tCw+FGvLbTPiNozwWc8lhoOp2cIl0976e9jgtJwqgrLFeQyRxbDc D3T/AIZN/Z9+H/xp+DEviD496x8Rv2UfG/w2vPjimhRXNvpvxA0horO5kstD 1C2j82x+3TXccNpMFX5JEuonSIJ59e+S/A34IfDf4m/DY+Jfjdr3j79lfxJ4 In+Lw0SG4h0/xvYOtrO1lpN7ap5tl9skukitpgoO10uI2WPaZh0c+m6DYata JNqsmqaHcWY1EzWAFrqAVo3dLeRSJEjnDBY3ALqrE/MQM17J8XfEvxx07RPj Fof7KfjjxV8DPBfjP9ofRvgVc3mg/DnQ/BuotY+KfCK6hpttd6vZvLrgWXVV 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 la4uLiSRi8kkjsSzOzEkknJJOeai+Fvxi+ON5DqF1Nq2l+JdKnu5ryWy+Ivh 618ZaG99OLZXu47aWN1+0+VbxRCcruWMMgbDEVleEPif8U5heXEuoWOv2M1z JdSWnjTRrbxPpbXUwhV7lYJkdfP2QRxibG5UBUEBiKXwN4/+IsqXVxJeafrN jLNJcPa+MNGh8SaW1zKIQ1wkMiMPO2QxoJcZVAVBwxFVwxHv7EZFf3L/AAC+ Fv7ZOkeJPjnonxL+JqeO/h/4j8Jav4dvfHd1qC/EnV9KfW9NaOzlW1uHYzxJ P9gumjlXyY/KnD4Bkx/bP8DPh3+1zY+JPjrpvxA+I7fEP4e+JfCOreHdU8fX mqp8RdR099c05ks5hb3DsZ40ufsN0ySDyozDMH25kx/Ur8EPhv8AtJW3iL4w eHvGnxPXx54J1vwpqfh/UfGc1yfHV/ZNq1gRaSrbTuWljScWVw0cn7pPJmDb QZMfV3w+i+LV9rHxVvJtd1vxNpOu+C9R0r4m67b37+L31O21NFvLee+zKZJ0 XULfTr13kJ8qSz8x9rRnH5If8F5oLq3+Ef7NPw98b+O9G8a/FbWdck1jVPiC XkistY0/SrKWxXUnAQlYphqFkgkgQxPJYXG04Vgv5Yf8FttN1HT/AIa/s9eC vGvjzS/G/wAS9U1KXU9S8biSQWes2OnWklnHqB+TIilW+s4xJChieSxn2n5W C/BH/BVbSpLH4e/Azwl4y8YaZ4n+IWr6nJqGo+NlklNlq1jp9tJaJft8hby5 ReWqCSJDGz2U+0naQvlHxUs9TtLvSG13XE8S6xPYBZdfjvZ9Qt9Xgt/9Ht5o J5VVpIlSNYFdcoTaOFY44/Iv4X/Ef/goJ8efAlp+z74J1b40/GrSV0mDw5p2 heB/hrH4h8R2Fl9nXTorNPFMtq1zbRLZxx2zFJQfs6xQFzGCsf5E+BvHf7bX xq8JaZ8E/B938WPitpaWEWg6dpHhLwIPEOu2dqIVsY7VNee3a4gjFsiW5KyD 9wsUJYoNqfnv4H8b/th/GDwzb/BXwdqXxP8AitZjTodE07RfC3ghdd161tBC tlHaprjwNcQRrbIluSkg/crHDuMa7U4bSbDxP4s1LTfDmhafrPibWtTuYdL0 bRdKsZtZ1i/mcJb29tawRq0ruwEcaRxgkgIoHAFfrd+yD/wbjfE2/wBJg8e/ tp+JPD/7OHwjH/Ex1bwDpusWuv8AxM1tEhI8i81uYtp+nPIlzIGW2juJGEYQ IjBJF/UL9mD/AIIX+KLmxg8Z/tmeNvDf7N3wxhxqOpeEE1i01L4ha2iRKRbz 6pM5sbGR0uXykCTyt5YURqdjr+g3wA/4I0+KdNsW8Zftd+MPDv7PXw/gZLnU PBQ1e01L4g6uPLA8i51GZjZWLulyxIhSeRtoURqQjj7E8I/sQ+MNLGp6z+0l rdp+zb4c0WzkvptP+Iif2J44114BYTzafZabOUdbtrW+E6QyAzMFGy3lLAV+ z9/Z2vwf8J+JPGv7CI8NaZ4N+EPwS0CxeDXtPLWnirRPDuoSaKJbS5dy89tD aWtxFe3t5CBEbOUrc27b5U/XfVotD+G/h/V/Hv7Ecnh+z8G/CT4MaNbuNZtv Mt/FOj6Fey6IZrSZn33FtFbQTR3l5dwqIjaSkTwENIn6sX1/pnw28Na/4v8A 2Nbnw9beEfhj8INDhnl1XT91l4m0rRb5tKMlrO7l54I7eCaO7u7qILF9lkK3 ELb5F6nVk0fwx4s8Z/EH9jLWtW/4Rv4T/Ca31HxRq/ijSYre88UWZ1dfC13e aZYyhnu7aeG/tJbqS5t4fJf7YdsISPP4reMrH9ob/gpNqmpape/a7P4fz6xH pfjb40T2cOmWniFra7AtPDHgWNTNFFcNEFE119pnigeSaNJ5pZIY7j8gdVi+ PH/BQLV9U1O6e9s/BFzqyaZ4s+LV1aJZ2muvb3OLbw74OQedHFO0QUST+fLH E7SRrNLJJDHP+TPjqP4yfttXmp+I9S+2N4Wk1JNO8SfFK5tY9OtdZaG4C22g eEkUywxTGPb5kwnlSN3kjWWWSSJZvivX9X8WfELVdQ8V+I76+1nUb+4WO71e /YsbqRFRI4I2xtBRAgVAQFUKo6qD+O/7Y3jz4c+DfEniL4c/s+29po3g/wAE pH4PgvLu2m1A65NDLKrXFgxIj8qARn9/NvLSSBoxuXzT+Y37WHjDwP4Z8Ra3 4D+CVtb6T4U8IqnhaO5uIpbz+15IZJFaeyc/J5cXln99KXZpJAUGV8w/mh+0 B4o8FeG9a1jwl8I0gsfD3hxF0GK7uIZLv+1JEd1aa0JwvlxBT+9k3FnfKDI3 njJxGJGWLJRTtBPVsd6/Pew12yt9S0Ftcu3urSbUrRfEEUEJa0tdMS6iuJLW P+8zkyu+3adxIJJya+FbTVrWG90ltVnee3kvrcazFHGWhhsVnSV4E7ktmRmx g7iRzzXytZarax3ulNqdw01tLe241dIoi0EFisySvCn94tmRmxjkkZNRV+xG l/FfTdH+HfiMePbu/wDFHhPXdEfwrcLrEwb4f+ItDmAaaRT5ZhdrOEs1n5bK 1vcXVtJCVljYJ+o2h/EXT9M+H3iJPGdxe+IPDmr6O/huYapIG8Ga5pEuTM6s YzEz2sOTa7GDQT3FvJERJGQn6N6b8QbPTPBetDxXcXuueH9W0t/D06alKD4Q 1nS5RmVxlDG7W0ZJtthBgmngkiKuhCzxylFbOSGUx7SAyMDweDxkdvQ4I6V+ Tvw71rVpbVNEtotIax1GWbSNNTVLNBH5l5vtvtUjFTGxt0uZWDyK5iTzsNGf LNfl54bu75ymnQpYG2vpJLCzS9t1CF7jMPnOSChMSzSEO6sUUyEFCFNfn/4P 1K/eFdNhXTzbXryWFml/bLsD3G6Dz2JBUmFZpGDOrFF8zBQ7DUFfvt8RPif8 LPEH7Lf7OP7L3hzSPEOvfti+DfHOifC/4VfFzxFLNo/in4S6fdX8Wvag1nqk En2+4h003MukNZXbtaWrtPPaRqojKfr18TvE3wm8Wfs4fAz9n2PQNZ1j9p3w 14v0r4efD74ja/JLp2tfDrT7i+TWbw299C32u4isJLiTTWtLpmtbZmnmtUUb Cn6ufEfxf8M/GHwA+Cf7PEGjax4n/aI8NeJNN+HvgX4geIA+n6v8PrC7vY9X vI4b2JvtdzFZNcTacbS6Zra3Zp5bZFGwr09zrMN54f03SLiN7q+0x5LbT7ia NEXT4JZfPeNJFAkcGRnxHKWjjMkrIu6ViP6RdE/4KM/CT4VeHoPCjeEbN9J0 zwr/AMIzf3GgQRWWr+J9SFvbQwaprF/5RZ57hIp90jJK0k05Zyxzs/ok8D/t 2fCD4FaFonhfTfCulpoOleD5PCuox+H47ey1nxRfta21vDqeq3/lNI886RzF nKSs8sxZiSW2fuP4E/bV+DXwU8Gp8ONE8E2lr4ct/CjeHr250WGK21jxDqPk 2yQ6jqd80JdpZUhlJbY7PJOxJIJ2fox8C/8AgoJpnwT8DeIvhfbfBDwLN4I8 X/BXW/hV4wm8IWGn+E/iD4zvdUt7K3ttc1HxFPY3k/mWn2SR0giRUY3l2DgT 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 2gFcMOa/SH/gmt8X7jxt8P8AxR8J9Vsbi4i+Cn9mx+ErzULv+0po/D2oSahH pOlXNywD3FxpMul3dgl4Uj+0WtlYztHFNJNDH+UWi+M7mzk8U+B7UXYs/h5e QQ6E13dm8mi02WWcWljLMQDNJYvA1vHdbY/NhtrdzFC5dF/HL4gTReH9WvdG s0nVdFult9OaS4M8kFq+/wAm3klwpka3MTwiYKnmRxxOY42LIOWPU4zjOOeT X6ZicM5QxITGrEE8j0xitK21nUZyLnz2E9v5jq5ckE529K8wbxFeQXxlikmR 2KsWWYh+mfvfjSV8JftT/wDBOX9lT9rvSdSvPiN8N9O03xneWhaH4keD9vhv xtbSEhUklnRTFd7cDEd7HMoGdoWsDWPAXhH4rqra9oltZ6vNH5jeJtGI0zXS zNt3ysFaOfkDInRzjhWSups7rSfEE8UOsaYZrmdgBqdtL9m1BGJUbmblX7D9 4rYAwCMmiv49/wBtz9mr4q/8E8PH+nfDeP4keGPiZ4A8SRT654OsvEXhS38R WlkqmJXnm0bUYJ7W0ujuEfmWsj7kBG5QdleBeOdK+IP7PV7Y+GJfEeieLPDu q2zavodlrGiQ67p9uCVUztp17FLBb3BA2loS5K8b8Eiu+12bx98HU03Sl8Qa V4g8OatbnU9J0vW9Et/EWnWbME3TCwvIpYIJiPl3wkkrkbgCRTslcdMEZwRk V//ZZW5kc3RyZWFtDQplbmRvYmoNCjIgMCBvYmoNCjw8DQovVHlwZSAvUGFn ZXMNCi9LaWRzIFs0IDAgUl0NCi9Db3VudCAxDQo+Pg0KZW5kb2JqDQo2IDAg b2JqDQo8PA0KL0tpZHMgWzcgMCBSXQ0KPj4NCmVuZG9iag0KNyAwIG9iag0K PDwNCi9MaW1pdHMgWzxmZWZmMDA1ZjAwNTAwMDQxMDA0NzAwNDUwMDMxPiA8 ZmVmZjAwNWYwMDUwMDA0MTAwNDcwMDQ1MDAzMT5dDQovTmFtZXMgWzxmZWZm MDA1ZjAwNTAwMDQxMDA0NzAwNDUwMDMxPiA1IDAgUl0NCj4+DQplbmRvYmoN CjUgMCBvYmoNCjw8DQovRCBbNCAwIFIgL1hZWiAtNCA3OTYgMF0NCj4+DQpl bmRvYmoNCjEgMCBvYmoNCjw8DQovVHlwZSAvQ2F0YWxvZw0KL1BhZ2VzIDIg MCBSDQovTmFtZXMgPDwgL0Rlc3RzIDYgMCBSPj4NCi9PdXRsaW5lcyA4IDAg Ug0KPj4NCmVuZG9iag0KOCAwIG9iag0KPDwNCi9Db3VudCAxDQovRmlyc3Qg OSAwIFINCi9MYXN0IDkgMCBSDQo+Pg0KZW5kb2JqDQo5IDAgb2JqDQo8PA0K L1RpdGxlIDxmZWZmMDA1MDAwNjEwMDY3MDA2NTAwMjAwMDMxPg0KL0Rlc3Qg PGZlZmYwMDVmMDA1MDAwNDEwMDQ3MDA0NTAwMzE+DQovUGFyZW50IDggMCBS DQo+Pg0KZW5kb2JqDQozIDAgb2JqDQo8PA0KL0NyZWF0aW9uRGF0ZSA8ZmVm ZjAwNDQwMDNhMDAzMjAwMzAwMDMxMDAzMDAwMzAwMDM2MDAzMDAwMzkwMDMw MDAzODAwMzEwMDMxMDAzMDAwMzc+DQovTW9kRGF0ZSA8ZmVmZjAwNDQwMDNh MDAzMjAwMzAwMDMxMDAzMDAwMzAwMDM2MDAzMDAwMzkwMDMwMDAzODAwMzEw MDMxMDAzMDAwMzc+DQovUHJvZHVjZXIgPGZlZmYwMDQzMDA2ZjAwNzIwMDY1 MDA2YzAwMjAwMDUwMDA0NDAwNDYwMDIwMDA0NTAwNmUwMDY3MDA2OTAwNmUw MDY1MDAyMDAwNTYwMDY1MDA3MjAwNzMwMDY5MDA2ZjAwNmUwMDIwMDAzMzAw MmUwMDMwMDAyZTAwMzAwMDJlMDAzNzAwMzMwMDM5Pg0KL0F1dGhvciA8ZmVm ZjAwNDQwMDUwMDA0Zj4NCi9DcmVhdG9yIDxmZWZmMDA0MzAwNmYwMDcyMDA2 NTAwNmMwMDQ0MDA1MjAwNDEwMDU3Pg0KL1RpdGxlIDxmZWZmMDA1MDAwNDUw MDUyMDA1MzAwNGYwMDRlMDA0MTAwNGMwMDIwMDA0NzAwNTIwMDQxMDA0ZTAw NTQwMDIwMDA0OTAwNGUwMDQ2MDA0ZjAwNTIwMDRkMDA0MTAwNTQwMDQ5MDA0 ZjAwNGU+DQo+Pg0KZW5kb2JqDQoxMSAwIG9iag0KPDwNCi9UeXBlIC9FeHRH U3RhdGUNCi9vcCBmYWxzZS9PUCBmYWxzZS9PUE0gMCANCj4+DQplbmRvYmoN CjE0IDAgb2JqDQo8PA0KL1R5cGUgL0ZvbnQNCi9TdWJ0eXBlIC9UeXBlMQ0K L05hbWUgL0YxNA0KL0NvcmVsX0lzVmVydGljYWwgZmFsc2UNCi9Db3JlbF9D aGFyU2V0IDANCi9CYXNlRm9udCAvTEJCVU1MK1ZlcmRhbmEsQm9sZA0KL0Zp cnN0Q2hhciAzMg0KL0xhc3RDaGFyIDI1NQ0KL1dpZHRocyAxNSAwIFINCi9F bmNvZGluZyAvV2luQW5zaUVuY29kaW5nDQovRm9udERlc2NyaXB0b3IgMTYg MCBSDQo+Pg0KZW5kb2JqDQoxNSAwIG9iag0KWzM0MiA0MDIgNTg3IDg2NyA3 MTEgMTI3MiA4NjIgMzMyIDU0NCA1NDQgNzExIDg2NyAzNjEgNDgwIDM2MSA2 OTAgNzExIDcxMSA3MTEgDQo3MTEgNzExIDcxMSA3MTEgNzExIDcxMSA3MTEg NDAyIDQwMiA4NjcgODY3IDg2NyA2MTcgOTY0IDc3NiA3NjIgNzI0IDgzMCA2 ODMgDQo2NTAgODExIDgzNyA1NDYgNTU1IDc3MSA2MzcgOTQ4IDg0NyA4NTAg NzMzIDg1MCA3ODIgNzExIDY4MiA4MTIgNzY0IDExMjkgNzY0IA0KNzM3IDY5 MiA1NDQgNjkwIDU0NCA4NjcgNzExIDcxMSA2NjggNjk5IDU4OCA2OTkgNjY0 IDQyMiA2OTkgNzEyIDM0MiA0MDMgNjcxIA0KMzQyIDEwNTggNzEyIDY4NyA2 OTkgNjk5IDQ5NyA1OTMgNDU2IDcxMiA2NTAgOTgwIDY2OSA2NTEgNTk3IDcx MSA1NDQgNzExIDg2NyANCjAgNzExIDAgMzMyIDcxMSA1ODcgMTA0OSA3MTEg NzExIDcxMSAxNzc3IDcxMSA1NDQgMTEzNSAwIDY5MiAwIDAgMzMyIDMzMiA1 ODcgDQo1ODcgNzExIDcxMSAxMDAwIDcxMSA5NjQgNTkzIDU0NCAxMDY4IDAg NTk3IDczNyAzNDIgNDAyIDcxMSA3MTEgNzExIDcxMSA1NDQgDQo3MTEgNzEx IDk2NCA1OTggODUwIDg2NyA0ODAgOTY0IDcxMSA1ODcgODY3IDU5OCA1OTgg NzExIDcyMSA3MTEgMzYxIDcxMSA1OTggDQo1OTggODUwIDExODIgMTE4MiAx MTgyIDYxNyA3NzYgNzc2IDc3NiA3NzYgNzc2IDc3NiAxMDk0IDcyNCA2ODMg NjgzIDY4MyA2ODMgDQo1NDYgNTQ2IDU0NiA1NDYgODMwIDg0NyA4NTAgODUw IDg1MCA4NTAgODUwIDg2NyA4NTAgODEyIDgxMiA4MTIgODEyIDczNyA3MzUg DQo3MTMgNjY4IDY2OCA2NjggNjY4IDY2OCA2NjggMTAxOCA1ODggNjY0IDY2 NCA2NjQgNjY0IDM0MiAzNDIgMzQyIDM0MiA2NzkgNzEyIA0KNjg3IDY4NyA2 ODcgNjg3IDY4NyA4NjcgNjg3IDcxMiA3MTIgNzEyIDcxMiA2NTEgNjk5IDY1 MSBdDQplbmRvYmoNCjE2IDAgb2JqDQo8PA0KL1R5cGUgL0ZvbnREZXNjcmlw dG9yDQovRm9udE5hbWUgL0xCQlVNTCtWZXJkYW5hLEJvbGQNCi9Bc2NlbnQg NzY1DQovQ2FwSGVpZ2h0IDUwMA0KL0Rlc2NlbnQgLTIwNw0KL0ZsYWdzIDMy DQovRm9udEJCb3ggWy01NTAgLTMwMyAxNzA3IDEwNzJdDQovSXRhbGljQW5n bGUgMA0KL1N0ZW1WIDANCi9BdmdXaWR0aCA1NjgNCi9MZWFkaW5nIDk5DQov TWF4V2lkdGggMjI1Nw0KL1hIZWlnaHQgMjUwDQovQ2hhclNldCAoL1kvTy9V L1Ivc3BhY2UvRi9FL0cvQS9OL1QvSS9NL28vci9tL2UvaS9uL2YvYS90L1Av RC9TL0MvVi9ML0spDQovRm9udEZpbGUgMTcgMCBSDQo+Pg0KZW5kb2JqDQox NyAwIG9iag0KPDwNCi9GaWx0ZXIgWy9GbGF0ZURlY29kZSBdDQovTGVuZ3Ro MSA3NTMNCi9MZW5ndGgyIDQxNTANCi9MZW5ndGgzIDUzMg0KL0xlbmd0aCA0 NjcwDQo+Pg0Kc3RyZWFtDQp42u2SZzhce7TGRYue6D0GURJlTNQRRPQaNWqE MUY3I8PoNcroZRARvYVIRC+jE50gRBC9hyBKlIhy55zznOOcz/fbfe7eX/bv /671/t/17MXDqYKAuxt6u8JAQiBhEWmAEQxpA4FDBBUQzjYAERHcmYgoJQ+P IhIGcUcgpQGKCCTMGaCrpAJQhts5wGGUIBGAjQPUHWANwyEl8A+7RxAXGACo paDwWFtL4D+GNjBbSqAuxOGvKwEifx38HQEAumJtiDvSwQtgLoILAMIV4t6/ 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 jskWmSDHwxgWCk3ua87vnA8X+zExNyoe9Mexm0bQ5aKmAMGFawPAXNttmKyw JhfGMpuVotlM5pcLz9xk31tfvVdC0CrxVopImuv+4IBu1mapTB857RcTbmcr +WyN5nYpu+VCZl79vw4pkb0hh2s31gRPjiUiXqm4TBakZhDNeJSYyBEPhGiR EMuhJqA3jN09Bs8pV+k6I4KUA+2j4TF6xBkgHsFhf2NncNRyeDNzdXUSkd4U upXS6Knud9nGTyrv4r+2n5NzioKEjfvWIrOfZxA15dk+T+qlUc/qcKumV/QP CreOcrRbzP8Fuub0ctHhyyzzdK3RoJgCjc21ltOj7rThAl70MnFYlw3zS8zt FoZpNkz1V67Uww8MKQS9P49FtIl8CJcRixz2NwkAdUIgSWf9tSparBPTHdC0 3kLUQLOER+Lx1hR1onTJDVV7y2kTqZPx/uW1DWpy8LRQTd8KLCkcKh0whm0V 5Miuzm3pMDimrYG/GOVcwBAceTQN5Dovna7os46cds618jsbdqzF8kDUDCbT d88HsT7dRvBTxu551yatkAcTeGcYpSP2PYo+lZiSRaJc2gtCkjlLhuGKR+cn YT7szbZkhrw11BXtbt0Cw659bGYZzKxSfhCdZqPbjnvGCUXvcjKOWu8bewsB KUhqSUAU0yt1H4+zSexp3nbRGAdm3/O6f4ncGvJJYMn/Vf3pZ1SZUM+Bu3/6 k8ueDPUvhKXy7FazMnyac/k7J00XfcXCtxEq0cLF81rZjrD1PP2HRMSBCK2n eJEHpX57REe13DEEs1vln+/wWSsGTFzcEJ1M/VWUwCzZuROlQY8X1vAu/Y1G zovoCo87+YSymmSVCXsqTvdX1HS+3BmOPN6tju4Ja4mh1zqTZaCWwMeH0RQq cGx+UyRDd/u+/bUEXeUeVwPdVuPU/ykey3VjzpycrrTn8BMLVWB4CS892C57 +VTHexaBn8lsznF9sw7dFOkbVeZCCIYRUNbMW8+9oROOvMv0ZaQOFFtM81GO 0jlGP8PX2fH+Qg9XFftLDH3LEtY6/hq9zkCD/W5uSmtYJpOIZ893/9bXeDP5 M7e+g57uIrSxhFQfExfu7o5g+QjL+6wx1SL/y4fy/w3+TxhAnWEQpDvCBYJ0 wvsf+RJg82VuZHN0cmVhbQ0KZW5kb2JqDQoxOCAwIG9iag0KPDwNCi9UeXBl IC9Gb250DQovU3VidHlwZSAvVHlwZTENCi9OYW1lIC9GMTgNCi9Db3JlbF9J c1ZlcnRpY2FsIGZhbHNlDQovQ29yZWxfQ2hhclNldCAwDQovQmFzZUZvbnQg L1NHTkxJSStWZXJkYW5hDQovRmlyc3RDaGFyIDMyDQovTGFzdENoYXIgMjU1 DQovV2lkdGhzIDE5IDAgUg0KL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcN Ci9Gb250RGVzY3JpcHRvciAyMCAwIFINCj4+DQplbmRvYmoNCjE5IDAgb2Jq DQpbMzUyIDM5NCA0NTkgODE4IDYzNiAxMDc2IDcyNyAyNjkgNDU0IDQ1NCA2 MzYgODE4IDM2NCA0NTQgMzY0IDQ1NCA2MzYgNjM2IDYzNiANCjYzNiA2MzYg NjM2IDYzNiA2MzYgNjM2IDYzNiA0NTQgNDU0IDgxOCA4MTggODE4IDU0NSAx MDAwIDY4NCA2ODYgNjk4IDc3MSA2MzIgDQo1NzUgNzc1IDc1MiA0MjEgNDU1 IDY5MyA1NTcgODQzIDc0OCA3ODcgNjAzIDc4NyA2OTUgNjg0IDYxNiA3MzIg Njg0IDk4OSA2ODUgDQo2MTUgNjg1IDQ1NCA0NTQgNDU0IDgxOCA2MzYgNjM2 IDYwMSA2MjMgNTIxIDYyMyA1OTYgMzUyIDYyMyA2MzMgMjc0IDM0NCA1OTIg DQoyNzQgOTczIDYzMyA2MDcgNjIzIDYyMyA0MjcgNTIxIDM5NCA2MzMgNTky IDgxOCA1OTIgNTkyIDUyNSA2MzUgNDU0IDYzNSA4MTggDQowIDYzNiAwIDI2 OSA2MzYgNDU5IDgxOCA2MzYgNjM2IDYzNiAxNTIyIDY4NCA0NTQgMTA3MCAw IDY4NSAwIDAgMjY5IDI2OSA0NTkgDQo0NTkgNTQ1IDYzNiAxMDAwIDYzNiA5 NzcgNTIxIDQ1NCA5ODIgMCA1MjUgNjE1IDM1MiAzOTQgNjM2IDYzNiA2MzYg NjM2IDQ1NCA2MzYgDQo2MzYgMTAwMCA1NDUgNjQ1IDgxOCA0NTQgMTAwMCA2 MzYgNTQyIDgxOCA1NDIgNTQyIDYzNiA2NDIgNjM2IDM2NCA2MzYgNTQyIDU0 NSANCjY0NSAxMDAwIDEwMDAgMTAwMCA1NDUgNjg0IDY4NCA2ODQgNjg0IDY4 NCA2ODQgOTg0IDY5OCA2MzIgNjMyIDYzMiA2MzIgNDIxIDQyMSANCjQyMSA0 MjEgNzc1IDc0OCA3ODcgNzg3IDc4NyA3ODcgNzg3IDgxOCA3ODcgNzMyIDcz MiA3MzIgNzMyIDYxNSA2MDYgNjIwIDYwMSANCjYwMSA2MDEgNjAxIDYwMSA2 MDEgOTU1IDUyMSA1OTYgNTk2IDU5NiA1OTYgMjc0IDI3NCAyNzQgMjc0IDYx MiA2MzMgNjA3IDYwNyANCjYwNyA2MDcgNjA3IDgxOCA2MDcgNjMzIDYzMyA2 MzMgNjMzIDU5MiA2MjMgNTkyIF0NCmVuZG9iag0KMjAgMCBvYmoNCjw8DQov VHlwZSAvRm9udERlc2NyaXB0b3INCi9Gb250TmFtZSAvU0dOTElJK1ZlcmRh bmENCi9Bc2NlbnQgNzY1DQovQ2FwSGVpZ2h0IDUwMA0KL0Rlc2NlbnQgLTIw Nw0KL0ZsYWdzIDMyDQovRm9udEJCb3ggWy01NjAgLTMwMyAxNDQ3IDEwNTFd DQovSXRhbGljQW5nbGUgMA0KL1N0ZW1WIDANCi9BdmdXaWR0aCA1MDgNCi9M ZWFkaW5nIDk5DQovTWF4V2lkdGggMjAwNg0KL1hIZWlnaHQgMjUwDQovQ2hh clNldCAoL3NwYWNlL2EvbC9lL3gvcGVyaW9kL3Uvbi9kL2Ivci9nL2F0L3Qv cy9vL0EvTC9GL1UvTi9NL0UvY29sb24vRC9SL1MvQy9PL1QvWS9QL0gvYy9t L2kvdi95L0kvZi9wL3cvaC9qL2NvbW1hL2svc2xhc2gvSy9HL3R3by96ZXJv L29uZS9wYXJlbmxlZnQvcGFyZW5yaWdodC9oeXBoZW4pDQovRm9udEZpbGUg MjEgMCBSDQo+Pg0KZW5kb2JqDQoyMSAwIG9iag0KPDwNCi9GaWx0ZXIgWy9G bGF0ZURlY29kZSBdDQovTGVuZ3RoMSAxMjIwDQovTGVuZ3RoMiA3NTkwDQov TGVuZ3RoMyA1MzINCi9MZW5ndGggODMxMQ0KPj4NCnN0cmVhbQ0KeNrtl1VY m93WrnF39wYt7g7FtcWKFJdAggfX4u7uVrQUintLgeIFirtLcXe3P9+/9lp0 He+zfe3kJPeYz3jGmOOdM7lCTy1nb+ei6ekA5mLjYucUBnwAO4GAdkAAJycU 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 XHs+V9Chn1JNbf6681veph3WiiSlPMtS/plbCKIr1NsRsI0auHTZjas5A1tz DkbBtyvsrTL7vEqqdcrAwIaA4KkOl7G8dHV/qcOH1/iIWWxKILbZYH9iGQZm msITkvqksTb3wSPs8ZVAf8DUBa+iW9qmowY/egFIM7e0f9984OiTu0oXSFyE mcch/sRH9hmSc5KtirN9hZhyqPiz7W34/KrzXU1LEHHOiUqRzejCKjZg0fOq 98dGBQarr59bcXtfjONwUc1Y8+DsJtvEL1c/P/QI3O267ngngPVhSHdqF3aP 1KZNI15/xwdX7TZJNOWL2CeNnWH+yCh8GDcF3l3nYKwwT1qJ74ambxDXQtpK xpFqAlSrssjeD6xvjNAdoLQApUWPyObAi+OhMu/y9nc+uSljpNPulepcyWhV HSWAnviR6cd4lx1J7hfN9SV+3zN+aAxFcHP4Hh8ZEqUXn7xVoJmnwzA9UA+M vC7vzx/k29HClu+yXRtq6kN1xiCWdlvwU/a9CFZrUT8/bj7ckmOV0qs5G7Yi YKl29p+hV/ZAzxe4FuDZxZK97yBUnVIgW790XDUfDcPeMFITFMyggmhyfmbj HCTKtN54+yBvjCK8mRnwI79LMmahDjnDvNixNYuNhDIBm45G63PyyiBgdkJL P36Xkjm3TCP4jXGvv0n4U6XejLNx+SgJT/sOKZYc5SWLCnwqUdbSPR8c5C31 YQ921OYQU6TCCYldc5dX88nb6dkNnyVw/m+lDJ6qnuQ967f7QShOFDfBmOfu QoLsxV5aB9nGq/kC+PUsVeS9AnpVWeX5CTtYHhWnvmUFe2heqLIH8i5YXW+N rvuN75USB2+1H71HmxorLZFOc0dlPvqfySYtfCVsXEr0ZmFx8bPDfrSmI+r9 3CDwLkfJz3RNB7wph7ihLaclIY7pEA48ePWNb8G2wuRLsbOGJkJs8FjCEk20 jnjJ1RojhKyBFn6N+suDxM8NBQQO8KdVqkObn2Euft7xwE4s3QStX5VLwZGl g1/ZCF1E1vG4sOrZgvtz3mIkjN2rwjtHhCxlpYspJqtProLWn/zWqoIKwjTz iWGkjPmGxIDhxhmCZS6qR/ed1Oa2pdWH0amXKi2e73O5VwkGd6Ry9LQduA25 5W9FqmxKiyaV06fu9n1QoqJD+d/9cIZQxrG+WvqET7df50D5zU34CWiwaAcP +VTfWr5dZ7PQU/ZUiTvcfkmBnTUSS/2uXC6ZdFgj7ePo7vtHMHn0cLLaCO0j CsWS4FCWdCk5ka8656AsEsordmmYMikfbpFi4/FZqvrStcVOQ1dx/txcSqIK y2g8XjZ1bH5V2S/rfe6bBhhb6sk/4tnZXThRfkyad0cHc3L65BmfLc3EzKdl fhBxZS6KUUb+GlSijhs4mp8daP6dZutrFWzmL8XvujAFldLNI77gx0vMeUoz IvF8PHo7T22N1rQlk4hp9VZICbPiwuFliiVAwOWJsYb8EHBZfcqNPqkTYPRd 7Pa8wUBQRokK/+oZDr16gB9wM6HjImqJt0vhe2oaa0qVXqtfERDkY6kuajTP Tsz6KXt2wTtN4LqLoeEHwroFy3xefK9vm+mDleMCBs3X2yeK35oW65iVjv46 896nGSuuD6aYVq9XmfsOYkOZ30oQNXEAhlOHDPo96wf0xbpyPH8yEGoXbOiL 9g27qk4uMRwhWleVq4hPhrgVJ9rmfH3gUhrwa5bMrWrpiV6TRug8ZBhkN/xy mKywdbneNNaucsrX3c5BAbe+cfCTOnoplVa2+HIZhyoERUnWZPb3XK3Yur2N EevJQyLNugN6yWvmgswVdlTZ/i0mLL65o5hsZ42PIV4zvb4BY8m6HYCPZv2m xq0wMvHhJa3tTr7H0kPqKYq7XHNTGTJsTzgV1aS//jw0y38+VSKfMUv92T6r hC4tOdXuPFBbXfczP4GUTOpD31GGPH0RLAv9s8fU1qEwVskM2pFsHkIxlodv D5HJDFvn2LUNyXnC+JVpn3+vpmM7zNb4WPEMOJ5YDK99mHfXhqmRoqexMPCi E62aEFAdbWWsMeVth2VyXWXzFNO73CYEOjnFQsAsWX+6htQQWTAtSp86Pex7 0EVT15RPHjmtjxRsrDzS0Chw6B1qLx1qV+oUZQinyWP3le1C/GEIJACIJO/h fFjEZkTPMNfDjFyADY7VEzs2Cq3V8Zh8M7AYYgo27bmCulE6Er9UuZx1K0Q5 weKG8tG+T0lxMDZMTT9Y7dG+FEEiNm6rRaMKJNISYYiMiogq/RDO9d1nUG2V SG0chkzjf402Ctp4qtzERjLL/yQ2u3MYPGvFdGKR++mutwl0VW8Ov7wK8TBN Lag6gLmL55HkQfoTRn+g0TgwFcfr8nqnyIBD9q0iPm+fFbLqIIsC9W4cV9NT B70pUh6KbFUgeW9du4VLYcDWRCAdncQJg9z5rb5+JAfk4BpIelIsuhVq1B1Z ed69sxWuLtJ3gsV788pTsQ2zMsnLtM7SFuObZH5PeTRoH2+YhLtgQuM95//l C/P/G/w/YWBmCwY6udhDgE42MP8DxtW3NWVuZHN0cmVhbQ0KZW5kb2JqDQp4 cmVmDQowIDI2DQowMDAwMDAwMDAwIDY1NTM1IGYNCjAwMDAzNzYxNjIgMDAw MDAgbg0KMDAwMDM3NTg2MiAwMDAwMCBuDQowMDAwMzc2NDM5IDAwMDAwIG4N CjAwMDAwMDAwMTcgMDAwMDAgbg0KMDAwMDM3NjExMSAwMDAwMCBuDQowMDAw Mzc1OTI2IDAwMDAwIG4NCjAwMDAzNzU5NjYgMDAwMDAgbg0KMDAwMDM3NjI2 MCAwMDAwMCBuDQowMDAwMzc2MzIyIDAwMDAwIG4NCjAwMDAwMDA0MzkgMDAw MDAgbg0KMDAwMDM3Njk4NSAwMDAwMCBuDQowMDAwMDAyNDk1IDAwMDAwIG4N CjAwMDAwNTc2ODggMDAwMDAgbg0KMDAwMDM3NzA1NiAwMDAwMCBuDQowMDAw Mzc3Mjk3IDAwMDAwIG4NCjAwMDAzNzgyMzggMDAwMDAgbg0KMDAwMDM3ODU4 NCAwMDAwMCBuDQowMDAwMzgzMzgxIDAwMDAwIG4NCjAwMDAzODM2MTcgMDAw MDAgbg0KMDAwMDM4NDU1NSAwMDAwMCBuDQowMDAwMzg0OTk1IDAwMDAwIG4N CjAwMDAxMDcwNDMgMDAwMDAgbg0KMDAwMDIwNjM0MiAwMDAwMCBuDQowMDAw MjYwMzcxIDAwMDAwIG4NCjAwMDAzMjAwNjYgMDAwMDAgbg0KdHJhaWxlcg0K PDwNCi9TaXplIDI2DQovUm9vdCAxIDAgUg0KL0luZm8gMyAwIFINCi9JRCBb PDhlOTYxMGQxOWUzZmJiNmY1ZDVhMjQ3ZmY3NjU4NjJiPjw4ZTk2MTBkMTll M2ZiYjZmNWQ1YTI0N2ZmNzY1ODYyYj5dDQo+Pg0Kc3RhcnR4cmVmDQozOTM0 MzQNCiUlRU9G ----559023410-1251336619-1277498552=:15176-- From BATV+38ce77434e3566a797e7+2498+infradead.org+hch@bombadil.srs.infradead.org Sat Jun 26 06:40:54 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_63,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 o5QBeqTN193638 for ; Sat, 26 Jun 2010 06:40:53 -0500 X-ASG-Debug-ID: 1277552615-1f2103500000-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 138C0154DCE5 for ; Sat, 26 Jun 2010 04:43:35 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id EBA0RgVRsSwC7MaO for ; Sat, 26 Jun 2010 04:43:35 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OSTnK-00043f-8e for xfs@oss.sgi.com; Sat, 26 Jun 2010 11:43:34 +0000 Date: Sat, 26 Jun 2010 07:43:34 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfstests: test the aio unwrittent extent conversion race Subject: [PATCH] xfstests: test the aio unwrittent extent conversion race Message-ID: <20100626114334.GA15157@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: 1277552616 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Signed-off-by: Christoph Hellwig Index: xfstests-dev/239 =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xfstests-dev/239 2010-06-26 11:38:22.000000000 +0000 @@ -0,0 +1,58 @@ +#! /bin/bash +# FS QA Test No. 239 +# +# Read from a sparse file immedialy after filling a hole to test for races +# in unwritten extent conversion. +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=dchinner@redhat.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $TEST_DIR/tst-aio-dio-sparse-unwritten +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +_supported_fs generic +_supported_os Linux + +AIO_TEST=src/aio-dio-regress/aio-dio-hole-filling-race +[ -x $AIO_TEST ] || _notrun "$AIO_TEST not built" + +echo "Silence is golden" + +for i in `seq 1 500`; do + $AIO_TEST $TEST_DIR/tst-aio-dio-hole-filling-race || break +done + +status=$? +exit Index: xfstests-dev/239.out =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xfstests-dev/239.out 2010-06-26 11:38:47.000000000 +0000 @@ -0,0 +1,2 @@ +QA output created by 239 +Silence is golden Index: xfstests-dev/group =================================================================== --- xfstests-dev.orig/group 2010-06-26 11:35:07.000000000 +0000 +++ xfstests-dev/group 2010-06-26 11:35:18.000000000 +0000 @@ -352,3 +352,4 @@ deprecated 236 auto quick metadata 237 auto quick acl 238 auto quick metadata ioctl +239 auto aio rw Index: xfstests-dev/src/aio-dio-regress/aio-dio-hole-filling-race.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xfstests-dev/src/aio-dio-regress/aio-dio-hole-filling-race.c 2010-06-26 11:39:40.000000000 +0000 @@ -0,0 +1,123 @@ +/* + * Read from a sparse file immedialy after filling a hole to test for races + * in unwritten extent conversion. + * + * Copyright (C) 2010 Red Hat, Inc. All Rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will 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 to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +#include +#include +#include +#include +#include +#include +#include + +#include + +#define BUF_SIZE 4096 +#define IO_PATTERN 0xab + +int main(int argc, char *argv[]) +{ + struct io_context *ctx = NULL; + struct io_event ev; + struct iocb iocb, *iocbs[] = { &iocb }; + void *buf; + char cmp_buf[BUF_SIZE]; + int fd, err = 0; + + fd = open(argv[1], O_DIRECT | O_CREAT | O_TRUNC | O_RDWR, 0600); + if (fd == -1) { + perror("open"); + return 1; + } + + err = posix_memalign(&buf, BUF_SIZE, BUF_SIZE); + if (err) { + fprintf(stderr, "error %s during %s\n", + strerror(-err), + "posix_memalign"); + return 1; + } + memset(buf, IO_PATTERN, BUF_SIZE); + memset(cmp_buf, IO_PATTERN, BUF_SIZE); + + /* + * Truncate to some random large file size. Just make sure + * it's not smaller than our I/O size. + */ + if (ftruncate(fd, 1024 * 1024 * 1024) < 0) { + perror("ftruncate"); + return 1; + } + + + /* + * Do a simple 4k write into a hole using aio. + */ + err = io_setup(1, &ctx); + if (err) { + fprintf(stderr, "error %s during %s\n", + strerror(-err), + "io_setup"); + return 1; + } + + io_prep_pwrite(&iocb, fd, buf, BUF_SIZE, 0); + + err = io_submit(ctx, 1, iocbs); + if (err != 1) { + fprintf(stderr, "error %s during %s\n", + strerror(-err), + "io_submit"); + return 1; + } + + err = io_getevents(ctx, 1, 1, &ev, NULL); + if (err != 1) { + fprintf(stderr, "error %s during %s\n", + strerror(-err), + "io_getevents"); + return 1; + } + + /* + * And then read it back. + * + * Using pread to keep it simple, but AIO has the same effect. + */ + if (pread(fd, buf, BUF_SIZE, 0) != BUF_SIZE) { + perror("pread"); + return 1; + } + + /* + * And depending on the machine we'll just get zeroes back quite + * often here. That's because the unwritten extent conversion + * hasn't finished. + */ + if (memcmp(buf, cmp_buf, BUF_SIZE)) { + unsigned long long *ubuf = (unsigned long long *)buf; + int i; + + for (i = 0; i < BUF_SIZE / sizeof(unsigned long long); i++) + printf("%d: 0x%llx\n", i, ubuf[i]); + return 1; + } + + return 0; +} From BATV+38ce77434e3566a797e7+2498+infradead.org+hch@bombadil.srs.infradead.org Sat Jun 26 06:42:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5QBgWJ4193677 for ; Sat, 26 Jun 2010 06:42:32 -0500 X-ASG-Debug-ID: 1277552716-0920003f0000-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 7395F407130 for ; Sat, 26 Jun 2010 04:45:16 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id yvhxoR5OOOtibc2J for ; Sat, 26 Jun 2010 04:45:16 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OSTov-000791-C3; Sat, 26 Jun 2010 11:45:13 +0000 Date: Sat, 26 Jun 2010 07:45:13 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs_db: check for valid inode data pointer before dereferencing Subject: Re: [PATCH] xfs_db: check for valid inode data pointer before dereferencing Message-ID: <20100626114513.GB15157@infradead.org> References: <1277418283-23381-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1277418283-23381-1-git-send-email-david@fromorbit.com> 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: 1277552716 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 25, 2010 at 08:24:43AM +1000, Dave Chinner wrote: > From: Dave Chinner > > When processing an inode, the code checks various flags to determine > whether to output messages or not. When checking the CLI provided > inode numbers to be verbose about, we fail to check if the inode > data structre returned is valid or not before dereferencing it. > Hence running xfs_check with the "serious errors only" flag, xfs_db > will crash. Fix up the "should we output" logic to be safe. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From BATV+38ce77434e3566a797e7+2498+infradead.org+hch@bombadil.srs.infradead.org Sat Jun 26 06:43: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 o5QBhMo3193785 for ; Sat, 26 Jun 2010 06:43:22 -0500 X-ASG-Debug-ID: 1277552766-6abb02740000-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 DA87A407138 for ; Sat, 26 Jun 2010 04:46:06 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 0KV2lPwFHQqmMQSl for ; Sat, 26 Jun 2010 04:46:06 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OSTpl-0000wD-Rj; Sat, 26 Jun 2010 11:46:05 +0000 Date: Sat, 26 Jun 2010 07:46:05 -0400 From: Christoph Hellwig To: Stanczak Slawomir Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_quota report problem Subject: Re: xfs_quota report problem Message-ID: <20100626114605.GC15157@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: 1277552766 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 24, 2010 at 11:02:02AM +0200, Stanczak Slawomir wrote: > Hi, > > I use xfs on my Debian Linux system. I have one question. > How can I display users with exceeded soft blocks limit only? > > I can do: > > xfs_quota -x -c report /home | grep day > > xfs_quota -x -c report /home | grep day | awk '{print $1}' > > but the solution isn't a good idea. > > Have you any other idea? I don't think it's implemented. I can add it to xfs_quota for you. Do you have an example of a quota tool that supports such functionality so that we can have a similar interface? From BATV+38ce77434e3566a797e7+2498+infradead.org+hch@bombadil.srs.infradead.org Sat Jun 26 06:45: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 o5QBjldE193867 for ; Sat, 26 Jun 2010 06:45:47 -0500 X-ASG-Debug-ID: 1277553183-33a9025a0000-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 E53B0131CD3B for ; Sat, 26 Jun 2010 04:53:03 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id oYpyKFQFUbyJRtxb for ; Sat, 26 Jun 2010 04:53:03 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OSTs6-0004M9-DD; Sat, 26 Jun 2010 11:48:30 +0000 Date: Sat, 26 Jun 2010 07:48:30 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: unregister inode shrinker before freeing filesystem structures Subject: Re: [PATCH] xfs: unregister inode shrinker before freeing filesystem structures Message-ID: <20100626114830.GD15157@infradead.org> References: <1277428120-27216-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1277428120-27216-1-git-send-email-david@fromorbit.com> 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: 1277553183 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 25, 2010 at 11:08:40AM +1000, Dave Chinner wrote: > From: Dave Chinner > > Currently we don't remove the XFS mount from the shrinker list until late in > the unmount path. By this time, we have already torn down the internals of the > filesystem (e.g. the per-ag structures), and hence if the shrinker is executed > between the teardown and the unregistering, the shrinker will get NULL per-ag > structure pointers and panic trying to dereference them. > > Fix this by removingthe xfs mount from the shrinker list before tearing down > it's internal structures. > > Signed-off-by: Dave Chinner > --- > fs/xfs/linux-2.6/xfs_super.c | 6 +++++- > 1 files changed, 5 insertions(+), 1 deletions(-) > > diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c > index e3de46c..4605cd4 100644 > --- a/fs/xfs/linux-2.6/xfs_super.c > +++ b/fs/xfs/linux-2.6/xfs_super.c > @@ -1156,9 +1156,13 @@ xfs_fs_put_super( > > XFS_bflush(mp->m_ddev_targp); > > + /* > + * Unregister the memory shrinker before we tear down the mount > + * structure so we don't have memory reclaim racing with us here. > + */ > + xfs_inode_shrinker_unregister(mp); Given that we register the shrinker after syncd is started for we should also tear it down as the very first thing for symmetry resons. From xfs@tlinx.org Sat Jun 26 20:08:19 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5R18IHh215663 for ; Sat, 26 Jun 2010 20:08:19 -0500 X-ASG-Debug-ID: 1277601059-470b00e90000-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 C93321555A0A for ; Sat, 26 Jun 2010 18:11:00 -0700 (PDT) Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id AnEEQGjVIQxCAxHh for ; Sat, 26 Jun 2010 18:11:00 -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 o5R1AtIB027369 for ; Sat, 26 Jun 2010 18:10:57 -0700 Message-ID: <4C26A51F.8020909@tlinx.org> Date: Sat, 26 Jun 2010 18:10:55 -0700 From: "Linda A. Walsh" User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: WARNING xfsdump [still] Cannot allocate memory for list of [root|non-root] attributes for nondir ino xxyz Subject: WARNING xfsdump [still] Cannot allocate memory for list of [root|non-root] attributes for nondir ino xxyz X-Stationery: 0.5.1 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1277601062 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.82 X-Barracuda-Spam-Status: No, SCORE=-1.82 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean FWIW -- that bug I mentioned a few weeks back that I thought was gone in the latest CVS of xfsdump -- isn't. It seems less frequent (maybe external attributes have been getting slow weeded out as they fail -- if it is random). What's 'unique' about this dump -- I just copied from one partition to another, to resize the first, and this is on the copy back. I.e. Stuff that xfs-restore just wrote has problems being read. First problem was about 30 minutes into the 'copy' Then about 2 more in the next half hour -- so not real often. This is with kernel 2.6.34. xfstools were downloaded a few weeks ago, so fairly recent. xfsdump: WARNING: could not get list of non-root attributes for nondir ino 2428439: Cannot allocate memory (12) in @ 108 MB/s, out @ 0.0 kB/s, 116 GB total, buffer 6% fullxfsdump: status at 02:25:06: 918808/2250704 files dumped, 54.3% data dumped, 1800 seconds elapsed in @ 14.0 MB/s, out @ 14.0 MB/s, 123 GB total, buffer 0% fullxfsdump: status at 02:30:06: 975579/2250704 files dumped, 57.6% data dumped, 2100 seconds elapsed in @ 0.0 kB/s, out @ 0.0 kB/s, 135 GB total, buffer 14% fullxfsdump: status at 02:35:07: 1062278/2250704 files dumped, 63.2% data dumped, 2401 seconds elapsed in @ 226 MB/s, out @ 157 MB/s, 152 GB total, buffer 91% fullxfsdump: status at 02:40:06: 1191037/2250704 files dumped, 71.5% data dumped, 2700 seconds elapsed in @ 0.0 kB/s, out @ 0.0 kB/s, 169 GB total, buffer 0% fullxfsdump: status at 02:45:06: 1321397/2250704 files dumped, 79.2% data dumped, 3000 seconds elapsed in @ 0.0 kB/s, out @ 120 MB/s, 176 GB total, buffer 30% full xfsdump: WARNING: could not get list of secure attributes for nondir ino 3929093: Cannot allocate memory (12) in @ 0.0 kB/s, out @ 118 MB/s, 177 GB total, buffer 7% full xfsdump: WARNING: could not get list of non-root attributes for nondir ino 3929095: Cannot allocate memory (12) From SRS0+7SU6+28+fromorbit.com=david@internode.on.net Sun Jun 27 21:25:16 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5S2PFoG259911 for ; Sun, 27 Jun 2010 21:25:16 -0500 X-ASG-Debug-ID: 1277692078-300d00590000-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 CF4B5409BAE for ; Sun, 27 Jun 2010 19:27:58 -0700 (PDT) Received: from mail.internode.on.net (bld-mail16.adl2.internode.on.net [150.101.137.101]) by cuda.sgi.com with ESMTP id svRg4f4vrTahQquY for ; Sun, 27 Jun 2010 19:27:58 -0700 (PDT) Received: from dastard (unverified [121.91.222.126]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 29423604-1927428 for ; Mon, 28 Jun 2010 11:57:57 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OT44W-0003kH-Ib; Mon, 28 Jun 2010 12:27:44 +1000 Date: Mon, 28 Jun 2010 12:27:44 +1000 From: Dave Chinner To: "Linda A. Walsh" Cc: xfs-oss X-ASG-Orig-Subj: Re: WARNING xfsdump [still] Cannot allocate memory for list of [root|non-root] attributes for nondir ino xxyz Subject: Re: WARNING xfsdump [still] Cannot allocate memory for list of [root|non-root] attributes for nondir ino xxyz Message-ID: <20100628022744.GX6590@dastard> References: <4C26A51F.8020909@tlinx.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C26A51F.8020909@tlinx.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: 1277692079 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.82 X-Barracuda-Spam-Status: No, SCORE=-1.82 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33764 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) 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 26, 2010 at 06:10:55PM -0700, Linda A. Walsh wrote: > > FWIW -- that bug I mentioned a few weeks back that I thought was > gone in the latest CVS > of xfsdump -- isn't. > > It seems less frequent (maybe external attributes have been getting > slow weeded out as > they fail -- if it is random). > > What's 'unique' about this dump -- I just copied from one partition > to another, to resize the first, > and this is on the copy back. > > I.e. Stuff that xfs-restore just wrote has problems being read. > > First problem was about 30 minutes into the 'copy' > > Then about 2 more in the next half hour -- so not real often. > > This is with kernel 2.6.34. > > xfstools were downloaded a few weeks ago, so fairly recent. > > xfsdump: WARNING: could not get list of non-root attributes for > nondir ino 2428439: Cannot allocate memory (12) > in @ 108 MB/s, out @ 0.0 kB/s, 116 GB total, buffer 6% > fullxfsdump: status at 02:25:06: 918808/2250704 files dumped, 54.3% > data dumped, 1800 seconds elapsed > in @ 14.0 MB/s, out @ 14.0 MB/s, 123 GB total, buffer 0% > fullxfsdump: status at 02:30:06: 975579/2250704 files dumped, 57.6% > data dumped, 2100 seconds elapsed > in @ 0.0 kB/s, out @ 0.0 kB/s, 135 GB total, buffer 14% > fullxfsdump: status at 02:35:07: 1062278/2250704 files dumped, 63.2% > data dumped, 2401 seconds elapsed > in @ 226 MB/s, out @ 157 MB/s, 152 GB total, buffer 91% > fullxfsdump: status at 02:40:06: 1191037/2250704 files dumped, 71.5% > data dumped, 2700 seconds elapsed > in @ 0.0 kB/s, out @ 0.0 kB/s, 169 GB total, buffer 0% > fullxfsdump: status at 02:45:06: 1321397/2250704 files dumped, 79.2% > data dumped, 3000 seconds elapsed > in @ 0.0 kB/s, out @ 120 MB/s, 176 GB total, buffer 30% full > > xfsdump: WARNING: could not get list of secure attributes for nondir > ino 3929093: Cannot allocate memory (12) > in @ 0.0 kB/s, out @ 118 MB/s, 177 GB total, buffer 7% full > > xfsdump: WARNING: could not get list of non-root attributes for > nondir ino 3929095: Cannot allocate memory (12) Can you get a list of all the attributes and their sizes on the inodes xfsdump is complaining about? Cheers, Dave. -- Dave Chinner david@fromorbit.com From Steffen.Knauf@gmx.net Mon Jun 28 04:27: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,FREEMAIL_FROM autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5S9R7Xq019717 for ; Mon, 28 Jun 2010 04:27:08 -0500 X-ASG-Debug-ID: 1277717673-1b2800700000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.gmx.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 66CFE14B1537 for ; Mon, 28 Jun 2010 02:34:33 -0700 (PDT) Received: from mail.gmx.net (mail.gmx.net [213.165.64.20]) by cuda.sgi.com with SMTP id 5oFAmNF8nJoUzL5R for ; Mon, 28 Jun 2010 02:34:33 -0700 (PDT) Received: (qmail 32701 invoked by uid 0); 28 Jun 2010 09:29:50 -0000 Received: from 195.122.130.2 by www171.gmx.net with HTTP; Mon, 28 Jun 2010 11:29:48 +0200 (CEST) Content-Type: text/plain; charset="utf-8" Date: Mon, 28 Jun 2010 11:29:48 +0200 From: "Steffen Knauf" Message-ID: <20100628092948.323370@gmx.net> MIME-Version: 1.0 X-ASG-Orig-Subj: Kernel Panic: Assertion failed: __xfs_iflags_test(ip, XFS_IRECLAIMABLE), file: fs/xfs/linux-2.6/xfs_sync.c, line: 727 Subject: Kernel Panic: Assertion failed: __xfs_iflags_test(ip, XFS_IRECLAIMABLE), file: fs/xfs/linux-2.6/xfs_sync.c, line: 727 To: xfs-oss X-Authenticated: #581924 X-Flags: 0001 X-Mailer: WWW-Mail 6100 (Global Message Exchange) X-Priority: 3 X-Provags-ID: V01U2FsdGVkX1/v6S4E2wHvsfWPkrSJ5xyyPzhljvP5q2dUvuM1Kp cd5RNaY+oJ6E8LjZZ+tLCCp8Uh292QCJKhMw== Content-Transfer-Encoding: 8bit X-GMX-UID: xS1OJjkIaHItI16zLiUlT7BiamdhZMSp X-FuHaFi: 0.52000000000000002 X-Barracuda-Connect: mail.gmx.net[213.165.64.20] X-Barracuda-Start-Time: 1277717675 X-Barracuda-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.33791 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 hi, Hello, i have lot's of trouble with a webserver which die with a kernel panic every week. Perhaps someone have an idea? Linux Kernel version: 2.6.33 Kernel log: --------------------------------------------------- Jun 27 04:53:19 web18 kernel: [415526.149123] Assertion failed: __xfs_iflags_test(ip, XFS_IRECLAIMABLE), file: fs/xfs/linux-2.6/xfs_sync.c, line: 727 Jun 27 04:53:19 web18 kernel: [415526.151594] ------------[ cut here ]------------ Jun 27 04:53:19 web18 kernel: [415526.152503] kernel BUG at fs/xfs/support/debug.c:109! Jun 27 04:53:19 web18 kernel: [415526.152503] invalid opcode: 0000 [#1] SMP Jun 27 04:53:19 web18 kernel: [415526.152503] last sysfs file: /sys/class/net/lo/operstate Jun 27 04:53:19 web18 kernel: [415526.152503] CPU 2 Jun 27 04:53:19 web18 kernel: [415526.152503] Pid: 1479, comm: xfssyncd Tainted: G W 2.6.33-cxo-15032010-v003 #1 0NJ023/PowerEdge 2850 Jun 27 04:53:19 web18 kernel: [415526.152503] RIP: 0010:[] [] assfail+0x1a/0x1e [xfs] Jun 27 04:53:19 web18 kernel: [415526.152503] RSP: 0018:ffff88033c27dda0 EFLAGS: 00010282 Jun 27 04:53:19 web18 kernel: [415526.152503] RAX: 000000000000007b RBX: ffff8801c87d5000 RCX: 0000000000000082 Jun 27 04:53:19 web18 kernel: [415526.152503] RDX: ffff880028280000 RSI: 0000000000000082 RDI: 0000000000000246 Jun 27 04:53:19 web18 kernel: [415526.152503] RBP: ffff88033bd74400 R08: 000000000000c887 R09: 0000000000000004 Jun 27 04:53:19 web18 kernel: [415526.152503] R10: ffffffff81324d10 R11: ffff88033cf1fc80 R12: 0000000000000002 Jun 27 04:53:19 web18 kernel: [415526.152503] R13: 0000000000000000 R14: 0000000000000001 R15: ffff88033c254c00 Jun 27 04:53:19 web18 kernel: [415526.152503] FS: 0000000000000000(0000) GS:ffff880028280000(0000) knlGS:0000000000000000 Jun 27 04:53:19 web18 kernel: [415526.152503] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b Jun 27 04:53:19 web18 kernel: [415526.152503] CR2: 00007f140bb085f0 CR3: 0000000049f70000 CR4: 00000000000006e0 Jun 27 04:53:19 web18 kernel: [415526.152503] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 Jun 27 04:53:19 web18 kernel: [415526.152503] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 Jun 27 04:53:19 web18 kernel: [415526.152503] Process xfssyncd (pid: 1479, threadinfo ffff88033c27c000, task ffff88033e6489c0) Jun 27 04:53:19 web18 kernel: [415526.152503] Stack: Jun 27 04:53:19 web18 kernel: [415526.152503] ffff88033c254c00 ffffffffa018d402 ffff88033bd74448 ffff88033bd74400 Jun 27 04:53:19 web18 kernel: [415526.152503] <0> 0000000000000000 ffffffffa018de09 ffff88033e4d8000 0000000200000000 Jun 27 04:53:19 web18 kernel: [415526.152503] <0> ffffffffa018d3c8 ffffffff812f145e 0170446300000000 0000000000000000 Jun 27 04:53:19 web18 kernel: [415526.152503] Call Trace: Jun 27 04:53:19 web18 kernel: [415526.152503] [] ? xfs_reclaim_inode+0x3a/0xde [xfs] Jun 27 04:53:19 web18 kernel: [415526.152503] [] ? xfs_inode_ag_walk+0x97/0xd6 [xfs] Jun 27 04:53:19 web18 kernel: [415526.152503] [] ? xfs_reclaim_inode+0x0/0xde [xfs] Jun 27 04:53:19 web18 kernel: [415526.152503] [] ? schedule_timeout+0x1fa/0x21a Jun 27 04:53:19 web18 kernel: [415526.152503] [] ? xfs_inode_ag_iterator+0x50/0x7a [xfs] Jun 27 04:53:19 web18 kernel: [415526.152503] [] ? xfs_reclaim_inode+0x0/0xde [xfs] Jun 27 04:53:19 web18 kernel: [415526.152503] [] ? xfs_sync_worker+0x26/0x5f [xfs] Jun 27 04:53:19 web18 kernel: [415526.152503] [] ? xfssyncd+0x14f/0x1ba [xfs] Jun 27 04:53:19 web18 kernel: [415526.152503] [] ? xfssyncd+0x0/0x1ba [xfs] Jun 27 04:53:19 web18 kernel: [415526.152503] [] ? kthread+0x79/0x81 Jun 27 04:53:19 web18 kernel: [415526.152503] [] ? kernel_thread_helper+0x4/0x10 Jun 27 04:53:19 web18 kernel: [415526.152503] [] ? kthread+0x0/0x81 Jun 27 04:53:19 web18 kernel: [415526.152503] [] ? kernel_thread_helper+0x0/0x10 Jun 27 04:53:19 web18 kernel: [415526.152503] Code: 44 24 08 01 00 00 00 e8 1d b3 fe e0 48 83 c4 18 c3 89 d1 48 83 ec 08 48 89 f2 31 c0 48 89 fe 48 c7 c7 97 c7 19 a0 e8 99 1f 16 e1 <0f> 0b eb fe 41 56 41 55 49 89 d5 41 54 49 89 cc 55 89 fd 48 c7 Jun 27 04:53:19 web18 kernel: [415526.152503] RIP [] assfail+0x1a/0x1e [xfs] Jun 27 04:53:19 web18 kernel: [415526.152503] RSP Jun 27 04:53:19 web18 kernel: [415526.211649] ---[ end trace 323be1c96277b67a ]--- --------------------------------------------------- greets Steffen -- GMX DSL: Internet-, Telefon- und Handy-Flat ab 19,99 EUR/mtl. Bis zu 150 EUR Startguthaben inklusive! http://portal.gmx.net/de/go/dsl From BATV+bf5ac97a206ecea5bbb9+2500+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 28 04:47:45 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.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 o5S9liY4020596 for ; Mon, 28 Jun 2010 04:47:44 -0500 X-ASG-Debug-ID: 1277718912-347c00520000-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 9A0D5114B476 for ; Mon, 28 Jun 2010 02:55:12 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id JAuCcDW6ARX8UCIJ for ; Mon, 28 Jun 2010 02:55:12 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OTAyz-00043n-2Q; Mon, 28 Jun 2010 09:50:29 +0000 Date: Mon, 28 Jun 2010 05:50:29 -0400 From: Christoph Hellwig To: Steffen Knauf Cc: xfs-oss X-ASG-Orig-Subj: Re: Kernel Panic: Assertion failed: __xfs_iflags_test(ip, XFS_IRECLAIMABLE), file: fs/xfs/linux-2.6/xfs_sync.c, line: 727 Subject: Re: Kernel Panic: Assertion failed: __xfs_iflags_test(ip, XFS_IRECLAIMABLE), file: fs/xfs/linux-2.6/xfs_sync.c, line: 727 Message-ID: <20100628095028.GA13389@infradead.org> References: <20100628092948.323370@gmx.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100628092948.323370@gmx.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: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1277718912 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Jun 28, 2010 at 11:29:48AM +0200, Steffen Knauf wrote: > hi, > > Hello, > > i have lot's of trouble with a webserver which die with a kernel panic every week. Perhaps someone have an idea? > > Linux Kernel version: 2.6.33 It's a know issue that has been fixed in -stable since. Please upgrade either to the latests 2.6.33-stable release or even better to 2.6.34-stable. From Steffen.Knauf@gmx.net Mon Jun 28 04:54:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM 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 o5S9sYY0020806 for ; Mon, 28 Jun 2010 04:54:34 -0500 X-ASG-Debug-ID: 1277719038-702b007b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.gmx.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 9D5931E16B1E for ; Mon, 28 Jun 2010 02:57:18 -0700 (PDT) Received: from mail.gmx.net (mail.gmx.net [213.165.64.20]) by cuda.sgi.com with SMTP id n5T8JX2dORYsAhsW for ; Mon, 28 Jun 2010 02:57:18 -0700 (PDT) Received: (qmail 4569 invoked by uid 0); 28 Jun 2010 09:57:17 -0000 Received: from 195.122.130.2 by www100.gmx.net with HTTP; Mon, 28 Jun 2010 11:57:16 +0200 (CEST) Cc: xfs@oss.sgi.com Content-Type: text/plain; charset="utf-8" Date: Mon, 28 Jun 2010 11:57:16 +0200 From: "Steffen Knauf" In-Reply-To: <20100628095028.GA13389@infradead.org> Message-ID: <20100628095716.323400@gmx.net> MIME-Version: 1.0 References: <20100628092948.323370@gmx.net> <20100628095028.GA13389@infradead.org> X-ASG-Orig-Subj: Re: Kernel Panic: Assertion failed: __xfs_iflags_test(ip, XFS_IRECLAIMABLE), file: fs/xfs/linux-2.6/xfs_sync.c, line: 727 Subject: Re: Kernel Panic: Assertion failed: __xfs_iflags_test(ip, XFS_IRECLAIMABLE), file: fs/xfs/linux-2.6/xfs_sync.c, line: 727 To: Christoph Hellwig X-Authenticated: #581924 X-Flags: 0001 X-Mailer: WWW-Mail 6100 (Global Message Exchange) X-Priority: 3 X-Provags-ID: V01U2FsdGVkX19d87lNC89d2/e/nQjob62hyCzknA23jT9lre5fI3 MMdqlWStJv6E+jSB3CQJod90mQs+kAgJ0MyA== Content-Transfer-Encoding: 8bit X-GMX-UID: rgVNPDwfZCEEIEqbbWwhQrp4IGhpZQZP X-FuHaFi: 0.53000000000000003 X-Barracuda-Connect: mail.gmx.net[213.165.64.20] X-Barracuda-Start-Time: 1277719039 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33794 Rule breakdown below pts rule 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, Thanks a lot, i'll upgrade to 2.6.34. greets Steffen -------- Original-Nachricht -------- > Datum: Mon, 28 Jun 2010 05:50:29 -0400 > Von: Christoph Hellwig > An: Steffen Knauf > CC: xfs-oss > Betreff: Re: Kernel Panic: Assertion failed: __xfs_iflags_test(ip, XFS_IRECLAIMABLE), file: fs/xfs/linux-2.6/xfs_sync.c, line: 727 > On Mon, Jun 28, 2010 at 11:29:48AM +0200, Steffen Knauf wrote: > > hi, > > > > Hello, > > > > i have lot's of trouble with a webserver which die with a kernel panic > every week. Perhaps someone have an idea? > > > > Linux Kernel version: 2.6.33 > > It's a know issue that has been fixed in -stable since. Please upgrade > either to the latests 2.6.33-stable release or even better to > 2.6.34-stable. -- GMX DSL: Internet-, Telefon- und Handy-Flat ab 19,99 EUR/mtl. Bis zu 150 EUR Startguthaben inklusive! http://portal.gmx.net/de/go/dsl From BATV+bf5ac97a206ecea5bbb9+2500+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 28 09:31: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 o5SEVnXu029700 for ; Mon, 28 Jun 2010 09:31:49 -0500 X-ASG-Debug-ID: 1277735674-4edc029c0000-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 B3F051558AF4 for ; Mon, 28 Jun 2010 07:34:34 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Y5gNXvQO8VrJxuYc for ; Mon, 28 Jun 2010 07:34:34 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OTFPu-0001SJ-Ah for xfs@oss.sgi.com; Mon, 28 Jun 2010 14:34:34 +0000 Date: Mon, 28 Jun 2010 10:34:34 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: remove incorrect log write optimization Subject: [PATCH] xfs: remove incorrect log write optimization Message-ID: <20100628143434.GA5473@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: 1277735674 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 do need a barrier for the first buffer of a split log write. Otherwise we might incorrectly stamp the tail LSN into transactions in the first block, or not flush data I/O before updating the inode size. Signed-off-by: Christoph Hellwig Index: xfs-dev/fs/xfs/xfs_log.c =================================================================== --- xfs-dev.orig/fs/xfs/xfs_log.c 2010-06-28 11:51:30.423004228 +0200 +++ xfs-dev/fs/xfs/xfs_log.c 2010-06-28 11:52:52.559255519 +0200 @@ -1423,11 +1423,8 @@ xlog_sync(xlog_t *log, XFS_BUF_BUSY(bp); XFS_BUF_ASYNC(bp); bp->b_flags |= XBF_LOG_BUFFER; - /* - * Do an ordered write for the log block. - * Its unnecessary to flush the first split block in the log wrap case. - */ - if (!split && (log->l_mp->m_flags & XFS_MOUNT_BARRIER)) + + if (log->l_mp->m_flags & XFS_MOUNT_BARRIER) XFS_BUF_ORDERED(bp); ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1); From BATV+bf5ac97a206ecea5bbb9+2500+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 28 09:31: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 o5SEVxTn029715 for ; Mon, 28 Jun 2010 09:31:59 -0500 X-ASG-Debug-ID: 1277735684-445501490000-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 0B5F640D5F1 for ; Mon, 28 Jun 2010 07:34:44 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id FuMvHHxYCbw1DdWg for ; Mon, 28 Jun 2010 07:34:44 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OTFQ4-0001U7-Mw for xfs@oss.sgi.com; Mon, 28 Jun 2010 14:34:44 +0000 Date: Mon, 28 Jun 2010 10:34:44 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: allow writeback from kswapd Subject: [PATCH] xfs: allow writeback from kswapd Message-ID: <20100628143444.GB5473@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: 1277735685 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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 only need disable I/O from direct or memcg reclaim. Signed-off-by: Christoph Hellwig Index: xfs-dev/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs-dev.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-06-28 11:57:06.652261386 +0200 +++ xfs-dev/fs/xfs/linux-2.6/xfs_aops.c 2010-06-28 11:59:17.846068204 +0200 @@ -1049,16 +1049,15 @@ xfs_vm_writepage( /* * 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 avoids stack overflows when called from deeply used stacks in + * random callers for direct reclaim or memcg reclaim. We explicitly + * allow reclaim from kswapd as the stack usage there is relatively low. * * 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) + if ((current->flags & (PF_MEMALLOC|PF_KSWAPD)) == PF_MEMALLOC) goto out_fail; /* From BATV+bf5ac97a206ecea5bbb9+2500+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 28 09:32:12 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5SEWC5D029738 for ; Mon, 28 Jun 2010 09:32:12 -0500 X-ASG-Debug-ID: 1277735698-4eda02700000-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 3D9BB1558B06 for ; Mon, 28 Jun 2010 07:34:58 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id ClSFYhsxWPDZpkTR for ; Mon, 28 Jun 2010 07:34:58 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OTFQH-0001Wh-Vi for xfs@oss.sgi.com; Mon, 28 Jun 2010 14:34:57 +0000 Date: Mon, 28 Jun 2010 10:34:57 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: writepage always has buffers Subject: [PATCH] xfs: writepage always has buffers Message-ID: <20100628143457.GC5473@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: 1277735698 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean These days we always have buffers thanks to ->page_mkwrite. And we already have an assert a few lines above tripping in case that was not true due to a bug. Signed-off-by: Christoph Hellwig Index: xfs-dev/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- xfs-dev.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-06-28 11:59:29.590253914 +0200 +++ xfs-dev/fs/xfs/linux-2.6/xfs_aops.c 2010-06-28 11:59:48.341006462 +0200 @@ -1072,13 +1072,6 @@ xfs_vm_writepage( 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); - /* Is this page beyond the end of the file? */ offset = i_size_read(inode); end_index = offset >> PAGE_CACHE_SHIFT; From aelder@sgi.com Mon Jun 28 17:01: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=unavailable 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 o5SM1kNb044141 for ; Mon, 28 Jun 2010 17:01:47 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay1.corp.sgi.com (Postfix) with ESMTP id DB9D88F80D3; Mon, 28 Jun 2010 15:04:32 -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 o5SM4WOI018107; Mon, 28 Jun 2010 17:04:32 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o5SM4W1o018105; Mon, 28 Jun 2010 17:04:32 -0500 From: Alex Elder Message-Id: <201006282204.o5SM4W1o018105@stout.americas.sgi.com> Date: Mon, 28 Jun 2010 17:04:32 -0500 To: xfs@oss.sgi.com Subject: [PATCH 01/15] xfs: kill off "xfs_dmapi_priv.h" 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 file "fs/xfs/linux-2.6/xfs_dmapi_priv.h" only two definitions, and those are used only once each in non-DMAPI XFS code. Get rid of those definitions--as well as the file--and use their expansions in the place they're used instead. Signed-off-by: Alex Elder --- fs/xfs/linux-2.6/xfs_dmapi_priv.h | 28 ---------------------------- fs/xfs/linux-2.6/xfs_file.c | 6 ++++-- fs/xfs/xfs_dmapi.h | 7 +------ fs/xfs/xfs_vnodeops.c | 6 ++++-- 4 files changed, 9 insertions(+), 38 deletions(-) Index: b/fs/xfs/linux-2.6/xfs_dmapi_priv.h =================================================================== --- a/fs/xfs/linux-2.6/xfs_dmapi_priv.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2000-2006 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_DMAPI_PRIV_H__ -#define __XFS_DMAPI_PRIV_H__ - -/* - * Based on IO_ISDIRECT, decide which i_ flag is set. - */ -#define DM_SEM_FLAG_RD(ioflags) (((ioflags) & IO_ISDIRECT) ? \ - DM_FLAGS_IMUX : 0) -#define DM_SEM_FLAG_WR (DM_FLAGS_IALLOCSEM_WR | DM_FLAGS_IMUX) - -#endif /*__XFS_DMAPI_PRIV_H__*/ Index: b/fs/xfs/linux-2.6/xfs_file.c =================================================================== --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2005, SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -276,9 +276,11 @@ xfs_file_aio_read( xfs_ilock(ip, XFS_IOLOCK_SHARED); if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && !(ioflags & IO_INVIS)) { - int dmflags = FILP_DELAY_FLAG(file) | DM_SEM_FLAG_RD(ioflags); int iolock = XFS_IOLOCK_SHARED; + int dmflags = FILP_DELAY_FLAG(file); + if (ioflags & IO_ISDIRECT) + dmflags |= DM_FLAGS_IMUX; ret = -XFS_SEND_DATA(mp, DM_EVENT_READ, ip, iocb->ki_pos, size, dmflags, &iolock); if (ret) { Index: b/fs/xfs/xfs_dmapi.h =================================================================== --- a/fs/xfs/xfs_dmapi.h +++ b/fs/xfs/xfs_dmapi.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -154,11 +154,6 @@ typedef enum { #define DM_FLAGS_IALLOCSEM_WR 0x020 /* thread holds i_alloc_sem wr */ /* - * Pull in platform specific event flags defines - */ -#include "xfs_dmapi_priv.h" - -/* * Macros to turn caller specified delay/block flags into * dm_send_xxxx_event flag DM_FLAGS_NDELAY. */ Index: b/fs/xfs/xfs_vnodeops.c =================================================================== --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * Copyright (c) 2000-2006, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -145,7 +145,9 @@ xfs_setattr( } else { if (DM_EVENT_ENABLED(ip, DM_EVENT_TRUNCATE) && !(flags & XFS_ATTR_DMI)) { - int dmflags = AT_DELAY_FLAG(flags) | DM_SEM_FLAG_WR; + int dmflags = AT_DELAY_FLAG(flags); + + dmflags |= DM_FLAGS_IALLOCSEM_WR|DM_FLAGS_IMUX; code = XFS_SEND_DATA(mp, DM_EVENT_TRUNCATE, ip, iattr->ia_size, 0, dmflags, NULL); if (code) { From aelder@sgi.com Mon Jun 28 17:01:31 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from 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 o5SM1Ujo044121 for ; Mon, 28 Jun 2010 17:01:31 -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 C75328F80D3 for ; Mon, 28 Jun 2010 15:04:13 -0700 (PDT) Received: from [128.162.232.148] ([128.162.232.148]) by cf--amer001e--3.americas.sgi.com with Microsoft SMTPSVC(6.0.3790.3959); Mon, 28 Jun 2010 17:04:13 -0500 Subject: [PATCH 00/15] xfs: minimize DMAPI footprint From: Alex Elder Reply-To: aelder@sgi.com To: xfs@oss.sgi.com Content-Type: text/plain; charset="UTF-8" Date: Mon, 28 Jun 2010 17:04:13 -0500 Message-ID: <1277762653.2040.554.camel@doink> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 28 Jun 2010 22:04:13.0620 (UTC) FILETIME=[D801C740:01CB170D] X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Back in the early part of May, Christoph Hellwig sent a patch to the list proposing to drop the remaining DMAPI support code from XFS. He said: 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. SGI has a product that uses the DMAPI support code that's included in mainline XFS, along with some additional code (the "never merged" stuff Christoph refers to) that we maintain separately. To our customers that need it, this is an extremely important feature. I was concerned that the outright removal of the code would make it very difficult for us to continue to offer our DMAPI support, especially given the rate at which code has been getting refactored in XFS lately. Specifically, DMAPI relies on the file system to send it messages when certain events occur, and I don't want to lose track of the specific spots in the XFS code where this needs to occur. I agree with Christoph that the DMAPI-specific definitions, etc., have no place in the top-of-tree code right now. However I wanted to provide an alternative to Christoph's patch, one which preserves some very specific hooks that allow DMAPI support to remain, but which otherwise minimizes the footprint and visibility of DMAPI definitions in environments where it is not used (and which furthermore incurs little or no run-time overhead in non-DMAPI builds). What follows is a set of patches that I think accomplishes these goals. The net result of these changes is: - DMAPI calls, along with almost all supporting logic, have been replaced with a set of 21 function calls that are used to signal events. The information supplied to these functions is exactly what is required--no more--and their syntactic interfaces do not rely on any internal DMAPI definitions. - Two files remain in top-of-tree code to support DMAPI: "xfs_dmops.c" and "xfs_dmapi.h". The former still defines the two functions called at mount and unmount time to attach/detach a vector of DMAPI operations to the mount point. I've simplified this though, so a null pointer is used if DMAPI is not present. The header file now only declares the two functions, and defines a set of no-op macros to be used for DMAPI event generation when DMAPI is not configured in the build. Everything else will now be defined elsewhere. The "dmapi" mount option remains, but the rest of the details have been moved into separate patches that we can continue to maintain out-of-tree, and I've been able to verify that with those patches applied, the result still implements the DMAPI support we need. I would like to get some feedback on these changes, and hopefully get agreement that the result is an acceptable compromise that *nearly* eliminates the DMAPI code from top-of-tree XFS. I think there are a few more small things that are DMAPI-specific that may need to be pulled out, but what I have here gives a pretty good idea of what I've set out to do. -Alex From aelder@sgi.com Mon Jun 28 17:02:20 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_22 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5SM2JQs044192 for ; Mon, 28 Jun 2010 17:02:20 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay2.corp.sgi.com (Postfix) with ESMTP id E94FF304048; Mon, 28 Jun 2010 15:05:02 -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 o5SM523d018144; Mon, 28 Jun 2010 17:05:02 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o5SM52Qc018142; Mon, 28 Jun 2010 17:05:02 -0500 From: Alex Elder Message-Id: <201006282205.o5SM52Qc018142@stout.americas.sgi.com> Date: Mon, 28 Jun 2010 17:05:02 -0500 To: xfs@oss.sgi.com Subject: [PATCH 04/15] xfs: rewrite DM_EVENT_ENABLED() as a function User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Re-implement DM_EVENT_ENABLED() using a real (static inline) function. Also, get rid of a redundant test of the DMAPI mount flag in xfs_file_open_exec(). Signed-off-by: Alex Elder --- fs/xfs/linux-2.6/xfs_file.c | 16 ++++++++++------ fs/xfs/linux-2.6/xfs_ioctl.c | 2 +- fs/xfs/xfs_bmap.c | 2 +- fs/xfs/xfs_dmapi.h | 30 +++++++++++++++++++----------- fs/xfs/xfs_rename.c | 8 ++++---- fs/xfs/xfs_vnodeops.c | 29 +++++++++++++++-------------- 6 files changed, 50 insertions(+), 37 deletions(-) Index: b/fs/xfs/linux-2.6/xfs_file.c =================================================================== --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -275,7 +275,8 @@ xfs_file_aio_read( mutex_lock(&inode->i_mutex); xfs_ilock(ip, XFS_IOLOCK_SHARED); - if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && !(ioflags & IO_INVIS)) { + if (xfs_dmapi_event_enabled(ip, DM_EVENT_READ) && + !(ioflags & IO_INVIS)) { int iolock = XFS_IOLOCK_SHARED; int dmflags = FILP_DELAY_FLAG(file); @@ -337,7 +338,8 @@ xfs_file_splice_read( xfs_ilock(ip, XFS_IOLOCK_SHARED); - if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && !(ioflags & IO_INVIS)) { + if (xfs_dmapi_event_enabled(ip, DM_EVENT_READ) + && !(ioflags & IO_INVIS)) { int iolock = XFS_IOLOCK_SHARED; int error; @@ -384,7 +386,8 @@ xfs_file_splice_write( xfs_ilock(ip, XFS_IOLOCK_EXCL); - if (DM_EVENT_ENABLED(ip, DM_EVENT_WRITE) && !(ioflags & IO_INVIS)) { + if (xfs_dmapi_event_enabled(ip, DM_EVENT_WRITE) + && !(ioflags & IO_INVIS)) { int iolock = XFS_IOLOCK_EXCL; int error; @@ -675,8 +678,8 @@ start: goto out_unlock_mutex; } - if ((DM_EVENT_ENABLED(ip, DM_EVENT_WRITE) && - !(ioflags & IO_INVIS) && !eventsent)) { + if (xfs_dmapi_event_enabled(ip, DM_EVENT_WRITE) && + !(ioflags & IO_INVIS) && !eventsent) { int dmflags = FILP_DELAY_FLAG(file); if (need_i_mutex) @@ -833,7 +836,8 @@ write_retry: } if (ret == -ENOSPC && - DM_EVENT_ENABLED(ip, DM_EVENT_NOSPACE) && !(ioflags & IO_INVIS)) { + xfs_dmapi_event_enabled(ip, DM_EVENT_NOSPACE) && + !(ioflags & IO_INVIS)) { xfs_iunlock(ip, iolock); if (need_i_mutex) mutex_unlock(&inode->i_mutex); Index: b/fs/xfs/linux-2.6/xfs_ioctl.c =================================================================== --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c @@ -1120,7 +1120,7 @@ xfs_ioctl_setattr( if (code) return code; - if (DM_EVENT_ENABLED(ip, DM_EVENT_ATTRIBUTE)) { + if (xfs_dmapi_event_enabled(ip, DM_EVENT_ATTRIBUTE)) { XFS_SEND_NAMESP(mp, DM_EVENT_ATTRIBUTE, ip, DM_RIGHT_NULL, NULL, DM_RIGHT_NULL, NULL, NULL, 0, 0, (mask & FSX_NONBLOCK) ? DM_FLAGS_NDELAY : 0); Index: b/fs/xfs/xfs_bmap.c =================================================================== --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -5619,7 +5619,7 @@ xfs_getbmap( * could misinterpret holes in a DMAPI file as true holes, * when in fact they may represent offline user data. */ - if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && + if (xfs_dmapi_event_enabled(ip, DM_EVENT_READ) && !(iflags & BMV_IF_NO_DMAPI_READ)) { error = XFS_SEND_DATA(mp, DM_EVENT_READ, ip, 0, 0, 0, NULL); Index: b/fs/xfs/xfs_dmapi.h =================================================================== --- a/fs/xfs/xfs_dmapi.h +++ b/fs/xfs/xfs_dmapi.h @@ -70,17 +70,6 @@ typedef enum { } dm_right_t; #define HAVE_DM_RIGHT_T -/* Defines for determining if an event message should be sent. */ -#ifdef XFS_DMAPI -#define DM_EVENT_ENABLED(ip, event) ( \ - unlikely ((ip)->i_mount->m_flags & XFS_MOUNT_DMAPI) && \ - ( ((ip)->i_d.di_dmevmask & (1 << event)) || \ - ((ip)->i_mount->m_dmevmask & (1 << event)) ) \ - ) -#else /* ! XFS_DMAPI */ -#define DM_EVENT_ENABLED(ip, event) (0) -#endif /* ! XFS_DMAPI */ - #define DM_XFS_VALID_FS_EVENTS ( \ (1 << DM_EVENT_PREUNMOUNT) | \ (1 << DM_EVENT_UNMOUNT) | \ @@ -201,6 +190,25 @@ typedef struct xfs_dmops { #define XFS_DMAPI_UNMOUNT_FLAGS(mp) \ (((mp)->m_dmevmask & (1 << DM_EVENT_UNMOUNT)) ? 0 : DM_FLAGS_UNWANTED) +/* + * DMAPI events only apply if DMAPI support was specified at mount + * time. If active, a particular DMAPI event can be enabled for + * all files the file system, or for individual files. + */ +static inline int +xfs_dmapi_event_enabled(struct xfs_inode *ip, dm_eventtype_t event) +{ +#ifdef XFS_DMAPI + unsigned int event_mask = 1 << event; + + return ip->i_mount->m_flags & XFS_MOUNT_DMAPI && + (ip->i_mount->m_dmevmask & event_mask || + ip->i_d.di_dmevmask & event_mask); +#else /* ! XFS_DMAPI */ + return 0; +#endif /* ! XFS_DMAPI */ +} + #define XFS_SEND_DATA(mp, ev,ip,off,len,fl,lock) \ (*(mp)->m_dm_ops->xfs_send_data)(ev,ip,off,len,fl,lock) #define XFS_SEND_MMAP(mp, vma,fl) \ Index: b/fs/xfs/xfs_rename.c =================================================================== --- a/fs/xfs/xfs_rename.c +++ b/fs/xfs/xfs_rename.c @@ -119,8 +119,8 @@ xfs_rename( xfs_itrace_entry(src_dp); xfs_itrace_entry(target_dp); - if (DM_EVENT_ENABLED(src_dp, DM_EVENT_RENAME) || - DM_EVENT_ENABLED(target_dp, DM_EVENT_RENAME)) { + if (xfs_dmapi_event_enabled(src_dp, DM_EVENT_RENAME) || + xfs_dmapi_event_enabled(target_dp, DM_EVENT_RENAME)) { error = XFS_SEND_NAMESP(mp, DM_EVENT_RENAME, src_dp, DM_RIGHT_NULL, target_dp, DM_RIGHT_NULL, @@ -374,8 +374,8 @@ xfs_rename( /* Fall through to std_return with error = 0 or errno from * xfs_trans_commit */ std_return: - if (DM_EVENT_ENABLED(src_dp, DM_EVENT_POSTRENAME) || - DM_EVENT_ENABLED(target_dp, DM_EVENT_POSTRENAME)) { + if (xfs_dmapi_event_enabled(src_dp, DM_EVENT_POSTRENAME) || + xfs_dmapi_event_enabled(target_dp, DM_EVENT_POSTRENAME)) { (void) XFS_SEND_NAMESP (mp, DM_EVENT_POSTRENAME, src_dp, DM_RIGHT_NULL, target_dp, DM_RIGHT_NULL, Index: b/fs/xfs/xfs_vnodeops.c =================================================================== --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -143,7 +143,7 @@ xfs_setattr( goto error_return; } } else { - if (DM_EVENT_ENABLED(ip, DM_EVENT_TRUNCATE) && + if (xfs_dmapi_event_enabled(ip, DM_EVENT_TRUNCATE) && !(flags & XFS_ATTR_DMI)) { int dmflags = AT_DELAY_FLAG(flags); @@ -472,7 +472,7 @@ xfs_setattr( return XFS_ERROR(code); } - if (DM_EVENT_ENABLED(ip, DM_EVENT_ATTRIBUTE) && + if (xfs_dmapi_event_enabled(ip, DM_EVENT_ATTRIBUTE) && !(flags & XFS_ATTR_DMI)) { (void) XFS_SEND_NAMESP(mp, DM_EVENT_ATTRIBUTE, ip, DM_RIGHT_NULL, NULL, DM_RIGHT_NULL, NULL, NULL, @@ -1062,7 +1062,8 @@ xfs_inactive( mp = ip->i_mount; - if (ip->i_d.di_nlink == 0 && DM_EVENT_ENABLED(ip, DM_EVENT_DESTROY)) + if (ip->i_d.di_nlink == 0 && + xfs_dmapi_event_enabled(ip, DM_EVENT_DESTROY)) XFS_SEND_DESTROY(mp, ip, DM_RIGHT_NULL); error = 0; @@ -1316,7 +1317,7 @@ xfs_create( if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); - if (DM_EVENT_ENABLED(dp, DM_EVENT_CREATE)) { + if (xfs_dmapi_event_enabled(dp, DM_EVENT_CREATE)) { error = XFS_SEND_NAMESP(mp, DM_EVENT_CREATE, dp, DM_RIGHT_NULL, NULL, DM_RIGHT_NULL, name->name, NULL, @@ -1492,7 +1493,7 @@ xfs_create( /* Fallthrough to std_return with error = 0 */ std_return: - if (DM_EVENT_ENABLED(dp, DM_EVENT_POSTCREATE)) { + if (xfs_dmapi_event_enabled(dp, DM_EVENT_POSTCREATE)) { XFS_SEND_NAMESP(mp, DM_EVENT_POSTCREATE, dp, DM_RIGHT_NULL, ip, DM_RIGHT_NULL, name->name, NULL, mode, error, 0); @@ -1734,7 +1735,7 @@ xfs_remove( if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); - if (DM_EVENT_ENABLED(dp, DM_EVENT_REMOVE)) { + if (xfs_dmapi_event_enabled(dp, DM_EVENT_REMOVE)) { error = XFS_SEND_NAMESP(mp, DM_EVENT_REMOVE, dp, DM_RIGHT_NULL, NULL, DM_RIGHT_NULL, name->name, NULL, ip->i_d.di_mode, 0, 0); @@ -1880,7 +1881,7 @@ xfs_remove( xfs_filestream_deassociate(ip); std_return: - if (DM_EVENT_ENABLED(dp, DM_EVENT_POSTREMOVE)) { + if (xfs_dmapi_event_enabled(dp, DM_EVENT_POSTREMOVE)) { XFS_SEND_NAMESP(mp, DM_EVENT_POSTREMOVE, dp, DM_RIGHT_NULL, NULL, DM_RIGHT_NULL, name->name, NULL, ip->i_d.di_mode, error, 0); @@ -1919,7 +1920,7 @@ xfs_link( if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); - if (DM_EVENT_ENABLED(tdp, DM_EVENT_LINK)) { + if (xfs_dmapi_event_enabled(tdp, DM_EVENT_LINK)) { error = XFS_SEND_NAMESP(mp, DM_EVENT_LINK, tdp, DM_RIGHT_NULL, sip, DM_RIGHT_NULL, @@ -2022,7 +2023,7 @@ xfs_link( /* Fall through to std_return with error = 0. */ std_return: - if (DM_EVENT_ENABLED(sip, DM_EVENT_POSTLINK)) { + if (xfs_dmapi_event_enabled(sip, DM_EVENT_POSTLINK)) { (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTLINK, tdp, DM_RIGHT_NULL, sip, DM_RIGHT_NULL, @@ -2088,7 +2089,7 @@ xfs_symlink( if (pathlen >= MAXPATHLEN) /* total string too long */ return XFS_ERROR(ENAMETOOLONG); - if (DM_EVENT_ENABLED(dp, DM_EVENT_SYMLINK)) { + if (xfs_dmapi_event_enabled(dp, DM_EVENT_SYMLINK)) { error = XFS_SEND_NAMESP(mp, DM_EVENT_SYMLINK, dp, DM_RIGHT_NULL, NULL, DM_RIGHT_NULL, link_name->name, @@ -2283,7 +2284,7 @@ xfs_symlink( /* Fall through to std_return with error = 0 or errno from * xfs_trans_commit */ std_return: - if (DM_EVENT_ENABLED(dp, DM_EVENT_POSTSYMLINK)) { + if (xfs_dmapi_event_enabled(dp, DM_EVENT_POSTSYMLINK)) { (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTSYMLINK, dp, DM_RIGHT_NULL, error ? NULL : ip, @@ -2417,7 +2418,7 @@ xfs_alloc_file_space( /* Generate a DMAPI event if needed. */ if (alloc_type != 0 && offset < ip->i_size && (attr_flags & XFS_ATTR_DMI) == 0 && - DM_EVENT_ENABLED(ip, DM_EVENT_WRITE)) { + xfs_dmapi_event_enabled(ip, DM_EVENT_WRITE)) { xfs_off_t end_dmi_offset; end_dmi_offset = offset+len; @@ -2531,7 +2532,7 @@ retry: } dmapi_enospc_check: if (error == ENOSPC && (attr_flags & XFS_ATTR_DMI) == 0 && - DM_EVENT_ENABLED(ip, DM_EVENT_NOSPACE)) { + xfs_dmapi_event_enabled(ip, DM_EVENT_NOSPACE)) { error = XFS_SEND_NAMESP(mp, DM_EVENT_NOSPACE, ip, DM_RIGHT_NULL, ip, DM_RIGHT_NULL, @@ -2697,7 +2698,7 @@ xfs_free_file_space( endoffset_fsb = XFS_B_TO_FSBT(mp, end_dmi_offset); if (offset < ip->i_size && (attr_flags & XFS_ATTR_DMI) == 0 && - DM_EVENT_ENABLED(ip, DM_EVENT_WRITE)) { + xfs_dmapi_event_enabled(ip, DM_EVENT_WRITE)) { if (end_dmi_offset > ip->i_size) end_dmi_offset = ip->i_size; error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, ip, From aelder@sgi.com Mon Jun 28 17:02: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=-4.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_22, LOCAL_GNU_PATCH autolearn=unavailable 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 o5SM277D044166 for ; Mon, 28 Jun 2010 17:02:08 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay3.corp.sgi.com (Postfix) with ESMTP id 26FCAAC024; Mon, 28 Jun 2010 15:04:53 -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 o5SM4qh3018134; Mon, 28 Jun 2010 17:04:52 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o5SM4qbU018132; Mon, 28 Jun 2010 17:04:52 -0500 From: Alex Elder Message-Id: <201006282204.o5SM4qbU018132@stout.americas.sgi.com> Date: Mon, 28 Jun 2010 17:04:52 -0500 To: xfs@oss.sgi.com Subject: [PATCH 03/15] xfs: move DMAPI definitions out of "xfs_mount.h" 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 XFS defines a bunch of DMAPI cruft in xfs_mount.h. There is no need for it to be there; move it instead into the xfs_dmapi.h file. A side-effect of this is that "xfs_dmapi.h" now depends on and needs to be #included after "xfs_mount.h" and "xfs_inode.h" (the latter of which itself depends on a "xfs_bmap_btree.h"). On the other hand, "xfs_dmapi.h" is #included by a LOT more files than it needs to be, so eliminate those cases. Finally, "xfs_inode.h" defines a type dm_attrs_t that is never referenced anywhere else, so kill it off. Signed-off-by: Alex Elder --- fs/xfs/linux-2.6/xfs_aops.c | 3 - fs/xfs/linux-2.6/xfs_buf.c | 3 - fs/xfs/linux-2.6/xfs_export.c | 3 - fs/xfs/linux-2.6/xfs_file.c | 2 - fs/xfs/linux-2.6/xfs_ioctl.c | 4 +- fs/xfs/linux-2.6/xfs_ioctl32.c | 3 - fs/xfs/linux-2.6/xfs_quotaops.c | 2 - fs/xfs/linux-2.6/xfs_super.c | 4 +- fs/xfs/linux-2.6/xfs_sync.c | 3 - fs/xfs/quota/xfs_dquot.c | 3 - fs/xfs/quota/xfs_dquot_item.c | 3 - fs/xfs/quota/xfs_qm.c | 3 - fs/xfs/quota/xfs_qm_bhv.c | 3 - fs/xfs/quota/xfs_qm_stats.c | 3 - fs/xfs/quota/xfs_qm_syscalls.c | 3 - fs/xfs/quota/xfs_trans_dquot.c | 3 - fs/xfs/support/debug.c | 3 - fs/xfs/xfs_alloc.c | 3 - fs/xfs/xfs_alloc_btree.c | 3 - fs/xfs/xfs_attr.c | 3 - fs/xfs/xfs_attr_leaf.c | 3 - fs/xfs/xfs_bmap.c | 4 +- fs/xfs/xfs_bmap_btree.c | 3 - fs/xfs/xfs_btree.c | 3 - fs/xfs/xfs_buf_item.c | 3 - fs/xfs/xfs_da_btree.c | 3 - fs/xfs/xfs_dfrag.c | 3 - fs/xfs/xfs_dir2.c | 3 - fs/xfs/xfs_dir2_block.c | 3 - fs/xfs/xfs_dir2_data.c | 3 - fs/xfs/xfs_dir2_leaf.c | 3 - fs/xfs/xfs_dir2_node.c | 3 - fs/xfs/xfs_dir2_sf.c | 3 - fs/xfs/xfs_dmapi.h | 61 ++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_dmops.c | 6 ++- fs/xfs/xfs_error.c | 3 - fs/xfs/xfs_extfree_item.c | 3 - fs/xfs/xfs_filestream.c | 3 - fs/xfs/xfs_fsops.c | 3 - fs/xfs/xfs_ialloc.c | 3 - fs/xfs/xfs_ialloc_btree.c | 3 - fs/xfs/xfs_iget.c | 3 - fs/xfs/xfs_inode.c | 3 - fs/xfs/xfs_inode.h | 8 ---- fs/xfs/xfs_inode_item.c | 3 - fs/xfs/xfs_iomap.c | 3 - fs/xfs/xfs_itable.c | 3 - fs/xfs/xfs_log.c | 3 - fs/xfs/xfs_log_recover.c | 3 - fs/xfs/xfs_mount.c | 3 - fs/xfs/xfs_mount.h | 66 ---------------------------------------- fs/xfs/xfs_rename.c | 4 +- fs/xfs/xfs_rtalloc.c | 3 - fs/xfs/xfs_rw.c | 3 - fs/xfs/xfs_trans.c | 3 - fs/xfs/xfs_trans_ail.c | 3 - fs/xfs/xfs_trans_buf.c | 3 - fs/xfs/xfs_trans_extfree.c | 3 - fs/xfs/xfs_trans_inode.c | 3 - fs/xfs/xfs_trans_item.c | 3 - fs/xfs/xfs_utils.c | 3 - fs/xfs/xfs_vnodeops.c | 2 - 62 files changed, 129 insertions(+), 187 deletions(-) Index: b/fs/xfs/linux-2.6/xfs_aops.c =================================================================== --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -23,7 +23,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_trans.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: b/fs/xfs/linux-2.6/xfs_buf.c =================================================================== --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * Copyright (c) 2000-2006, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -39,7 +39,6 @@ #include "xfs_inum.h" #include "xfs_log.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trace.h" Index: b/fs/xfs/linux-2.6/xfs_export.c =================================================================== --- a/fs/xfs/linux-2.6/xfs_export.c +++ b/fs/xfs/linux-2.6/xfs_export.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004-2005 Silicon Graphics, Inc. + * Copyright (c) 2004-2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -23,7 +23,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_export.h" #include "xfs_vnodeops.h" Index: b/fs/xfs/linux-2.6/xfs_file.c =================================================================== --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -24,7 +24,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_trans.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" @@ -36,6 +35,7 @@ #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" +#include "xfs_dmapi.h" #include "xfs_bmap.h" #include "xfs_error.h" #include "xfs_rw.h" Index: b/fs/xfs/linux-2.6/xfs_ioctl.c =================================================================== --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" @@ -34,6 +33,7 @@ #include "xfs_dir2_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_dmapi.h" #include "xfs_ioctl.h" #include "xfs_btree.h" #include "xfs_ialloc.h" Index: b/fs/xfs/linux-2.6/xfs_ioctl32.c =================================================================== --- a/fs/xfs/linux-2.6/xfs_ioctl32.c +++ b/fs/xfs/linux-2.6/xfs_ioctl32.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004-2005 Silicon Graphics, Inc. + * Copyright (c) 2004-2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -29,7 +29,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_attr_sf.h" Index: b/fs/xfs/linux-2.6/xfs_quotaops.c =================================================================== --- a/fs/xfs/linux-2.6/xfs_quotaops.c +++ b/fs/xfs/linux-2.6/xfs_quotaops.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2008, Christoph Hellwig + * Copyright (c) 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -16,7 +17,6 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "xfs.h" -#include "xfs_dmapi.h" #include "xfs_sb.h" #include "xfs_inum.h" #include "xfs_log.h" Index: b/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * Copyright (c) 2000-2006, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" @@ -35,6 +34,7 @@ #include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_dmapi.h" #include "xfs_btree.h" #include "xfs_btree_trace.h" #include "xfs_ialloc.h" Index: b/fs/xfs/linux-2.6/xfs_sync.c =================================================================== --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: b/fs/xfs/quota/xfs_dquot.c =================================================================== --- a/fs/xfs/quota/xfs_dquot.c +++ b/fs/xfs/quota/xfs_dquot.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2003 Silicon Graphics, Inc. + * Copyright (c) 2000-2003, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: b/fs/xfs/quota/xfs_dquot_item.c =================================================================== --- a/fs/xfs/quota/xfs_dquot_item.c +++ b/fs/xfs/quota/xfs_dquot_item.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2003 Silicon Graphics, Inc. + * Copyright (c) 2000-2003, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: b/fs/xfs/quota/xfs_qm.c =================================================================== --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: b/fs/xfs/quota/xfs_qm_bhv.c =================================================================== --- a/fs/xfs/quota/xfs_qm_bhv.c +++ b/fs/xfs/quota/xfs_qm_bhv.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * Copyright (c) 2000-2006, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: b/fs/xfs/quota/xfs_qm_stats.c =================================================================== --- a/fs/xfs/quota/xfs_qm_stats.c +++ b/fs/xfs/quota/xfs_qm_stats.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2003 Silicon Graphics, Inc. + * Copyright (c) 2000-2003, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: b/fs/xfs/quota/xfs_qm_syscalls.c =================================================================== --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -28,7 +28,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: b/fs/xfs/quota/xfs_trans_dquot.c =================================================================== --- a/fs/xfs/quota/xfs_trans_dquot.c +++ b/fs/xfs/quota/xfs_trans_dquot.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2002 Silicon Graphics, Inc. + * Copyright (c) 2000-2002, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: b/fs/xfs/support/debug.c =================================================================== --- a/fs/xfs/support/debug.c +++ b/fs/xfs/support/debug.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2003, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -22,7 +22,6 @@ #include "xfs_sb.h" #include "xfs_inum.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_error.h" Index: b/fs/xfs/xfs_alloc.c =================================================================== --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2002, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: b/fs/xfs/xfs_alloc_btree.c =================================================================== --- a/fs/xfs/xfs_alloc_btree.c +++ b/fs/xfs/xfs_alloc_btree.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2001, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: b/fs/xfs/xfs_attr.c =================================================================== --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -26,7 +26,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: b/fs/xfs/xfs_attr_leaf.c =================================================================== --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: b/fs/xfs/xfs_bmap.c =================================================================== --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * Copyright (c) 2000-2006, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -34,8 +34,8 @@ #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_btree.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" +#include "xfs_dmapi.h" #include "xfs_ialloc.h" #include "xfs_itable.h" #include "xfs_dir2_data.h" Index: b/fs/xfs/xfs_bmap_btree.c =================================================================== --- a/fs/xfs/xfs_bmap_btree.c +++ b/fs/xfs/xfs_bmap_btree.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2003, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: b/fs/xfs/xfs_btree.c =================================================================== --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2002, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: b/fs/xfs/xfs_buf_item.c =================================================================== --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -24,7 +24,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_buf_item.h" #include "xfs_trans_priv.h" Index: b/fs/xfs/xfs_da_btree.c =================================================================== --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: b/fs/xfs/xfs_dfrag.c =================================================================== --- a/fs/xfs/xfs_dfrag.c +++ b/fs/xfs/xfs_dfrag.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * Copyright (c) 2000-2006, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: b/fs/xfs/xfs_dir2.c =================================================================== --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2001, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: b/fs/xfs/xfs_dir2_block.c =================================================================== --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2003, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: b/fs/xfs/xfs_dir2_data.c =================================================================== --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2002, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: b/fs/xfs/xfs_dir2_leaf.c =================================================================== --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2003, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: b/fs/xfs/xfs_dir2_node.c =================================================================== --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: b/fs/xfs/xfs_dir2_sf.c =================================================================== --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2003, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" Index: b/fs/xfs/xfs_dmapi.h =================================================================== --- a/fs/xfs/xfs_dmapi.h +++ b/fs/xfs/xfs_dmapi.h @@ -167,4 +167,65 @@ typedef enum { DM_FLAGS_NDELAY : 0) #define AT_DELAY_FLAG(f) ((f & XFS_ATTR_NONBLOCK) ? DM_FLAGS_NDELAY : 0) +/* + * Prototypes and functions for the Data Migration subsystem. + */ + +extern int xfs_dmops_get(struct xfs_mount *); +extern void xfs_dmops_put(struct xfs_mount *); + +extern struct xfs_dmops xfs_dmcore_xfs; + +typedef int (*xfs_send_data_t)(int, struct xfs_inode *, + xfs_off_t, size_t, int, int *); +typedef int (*xfs_send_mmap_t)(struct vm_area_struct *, uint); +typedef int (*xfs_send_destroy_t)(struct xfs_inode *, dm_right_t); +typedef int (*xfs_send_namesp_t)(dm_eventtype_t, struct xfs_mount *, + struct xfs_inode *, dm_right_t, + struct xfs_inode *, dm_right_t, + const char *, const char *, mode_t, int, int); +typedef int (*xfs_send_mount_t)(struct xfs_mount *, dm_right_t, + char *, char *); +typedef void (*xfs_send_unmount_t)(struct xfs_mount *, struct xfs_inode *, + dm_right_t, mode_t, int, int); + +typedef struct xfs_dmops { + xfs_send_data_t xfs_send_data; + xfs_send_mmap_t xfs_send_mmap; + xfs_send_destroy_t xfs_send_destroy; + xfs_send_namesp_t xfs_send_namesp; + xfs_send_mount_t xfs_send_mount; + xfs_send_unmount_t xfs_send_unmount; +} xfs_dmops_t; + +#define XFS_DMAPI_UNMOUNT_FLAGS(mp) \ + (((mp)->m_dmevmask & (1 << DM_EVENT_UNMOUNT)) ? 0 : DM_FLAGS_UNWANTED) + +#define XFS_SEND_DATA(mp, ev,ip,off,len,fl,lock) \ + (*(mp)->m_dm_ops->xfs_send_data)(ev,ip,off,len,fl,lock) +#define XFS_SEND_MMAP(mp, vma,fl) \ + (*(mp)->m_dm_ops->xfs_send_mmap)(vma,fl) +#define XFS_SEND_DESTROY(mp, ip,right) \ + (*(mp)->m_dm_ops->xfs_send_destroy)(ip,right) +#define XFS_SEND_NAMESP(mp, ev,b1,r1,b2,r2,n1,n2,mode,rval,fl) \ + (*(mp)->m_dm_ops->xfs_send_namesp)(ev,NULL,b1,r1,b2,r2,n1,n2,mode,rval,fl) +#define XFS_SEND_MOUNT(mp,right,path,name) \ + (*(mp)->m_dm_ops->xfs_send_mount)(mp,right,path,name) +#define XFS_SEND_PREUNMOUNT(mp) \ +do { \ + if (mp->m_flags & XFS_MOUNT_DMAPI) { \ + (*(mp)->m_dm_ops->xfs_send_namesp)(DM_EVENT_PREUNMOUNT, mp, \ + (mp)->m_rootip, DM_RIGHT_NULL, \ + (mp)->m_rootip, DM_RIGHT_NULL, \ + NULL, NULL, 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); \ + } \ +} while (0) +#define XFS_SEND_UNMOUNT(mp) \ +do { \ + if (mp->m_flags & XFS_MOUNT_DMAPI) { \ + (*(mp)->m_dm_ops->xfs_send_unmount)(mp, (mp)->m_rootip, \ + DM_RIGHT_NULL, 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); \ + } \ +} while (0) + #endif /* __XFS_DMAPI_H__ */ Index: b/fs/xfs/xfs_dmops.c =================================================================== --- a/fs/xfs/xfs_dmops.c +++ b/fs/xfs/xfs_dmops.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2003, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -21,10 +21,12 @@ #include "xfs_log.h" #include "xfs_trans.h" #include "xfs_sb.h" -#include "xfs_dmapi.h" #include "xfs_inum.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_bmap_btree.h" +#include "xfs_inode.h" +#include "xfs_dmapi.h" static struct xfs_dmops xfs_dmcore_stub = { Index: b/fs/xfs/xfs_error.c =================================================================== --- a/fs/xfs/xfs_error.c +++ b/fs/xfs/xfs_error.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2001, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_dir2_sf.h" Index: b/fs/xfs/xfs_extfree_item.c =================================================================== --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2001, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -24,7 +24,6 @@ #include "xfs_buf_item.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trans_priv.h" #include "xfs_extfree_item.h" Index: b/fs/xfs/xfs_filestream.c =================================================================== --- a/fs/xfs/xfs_filestream.c +++ b/fs/xfs/xfs_filestream.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2007 Silicon Graphics, Inc. + * Copyright (c) 2006-2007, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -24,7 +24,6 @@ #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_log.h" #include "xfs_trans.h" #include "xfs_sb.h" Index: b/fs/xfs/xfs_fsops.c =================================================================== --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: b/fs/xfs/xfs_ialloc.c =================================================================== --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2002, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: b/fs/xfs/xfs_ialloc_btree.c =================================================================== --- a/fs/xfs/xfs_ialloc_btree.c +++ b/fs/xfs/xfs_ialloc_btree.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2001, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: b/fs/xfs/xfs_iget.c =================================================================== --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -26,7 +26,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: b/fs/xfs/xfs_inode.c =================================================================== --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * Copyright (c) 2000-2006, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -28,7 +28,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: b/fs/xfs/xfs_inode.h =================================================================== --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2003, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -221,12 +221,6 @@ struct xfs_mount; struct xfs_trans; struct xfs_dquot; -typedef struct dm_attrs_s { - __uint32_t da_dmevmask; /* DMIG event mask */ - __uint16_t da_dmstate; /* DMIG state info */ - __uint16_t da_pad; /* DMIG extra padding */ -} dm_attrs_t; - typedef struct xfs_inode { /* Inode linking and identification information. */ struct xfs_mount *i_mount; /* fs mount struct ptr */ Index: b/fs/xfs/xfs_inode_item.c =================================================================== --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2002, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -26,7 +26,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trans_priv.h" #include "xfs_bmap_btree.h" Index: b/fs/xfs/xfs_iomap.c =================================================================== --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * Copyright (c) 2000-2006, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_ag.h" #include "xfs_dir2.h" #include "xfs_alloc.h" -#include "xfs_dmapi.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" Index: b/fs/xfs/xfs_itable.c =================================================================== --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2002, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: b/fs/xfs/xfs_log.c =================================================================== --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_log_priv.h" Index: b/fs/xfs/xfs_log_recover.c =================================================================== --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * Copyright (c) 2000-2006, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_bmap_btree.h" Index: b/fs/xfs/xfs_mount.c =================================================================== --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: b/fs/xfs/xfs_mount.h =================================================================== --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -66,65 +66,6 @@ struct xfs_nameops; struct xfs_ail; struct xfs_quotainfo; - -/* - * Prototypes and functions for the Data Migration subsystem. - */ - -typedef int (*xfs_send_data_t)(int, struct xfs_inode *, - xfs_off_t, size_t, int, int *); -typedef int (*xfs_send_mmap_t)(struct vm_area_struct *, uint); -typedef int (*xfs_send_destroy_t)(struct xfs_inode *, dm_right_t); -typedef int (*xfs_send_namesp_t)(dm_eventtype_t, struct xfs_mount *, - struct xfs_inode *, dm_right_t, - struct xfs_inode *, dm_right_t, - const unsigned char *, const unsigned char *, - mode_t, int, int); -typedef int (*xfs_send_mount_t)(struct xfs_mount *, dm_right_t, - char *, char *); -typedef void (*xfs_send_unmount_t)(struct xfs_mount *, struct xfs_inode *, - dm_right_t, mode_t, int, int); - -typedef struct xfs_dmops { - xfs_send_data_t xfs_send_data; - xfs_send_mmap_t xfs_send_mmap; - xfs_send_destroy_t xfs_send_destroy; - xfs_send_namesp_t xfs_send_namesp; - xfs_send_mount_t xfs_send_mount; - xfs_send_unmount_t xfs_send_unmount; -} xfs_dmops_t; - -#define XFS_DMAPI_UNMOUNT_FLAGS(mp) \ - (((mp)->m_dmevmask & (1 << DM_EVENT_UNMOUNT)) ? 0 : DM_FLAGS_UNWANTED) - -#define XFS_SEND_DATA(mp, ev,ip,off,len,fl,lock) \ - (*(mp)->m_dm_ops->xfs_send_data)(ev,ip,off,len,fl,lock) -#define XFS_SEND_MMAP(mp, vma,fl) \ - (*(mp)->m_dm_ops->xfs_send_mmap)(vma,fl) -#define XFS_SEND_DESTROY(mp, ip,right) \ - (*(mp)->m_dm_ops->xfs_send_destroy)(ip,right) -#define XFS_SEND_NAMESP(mp, ev,b1,r1,b2,r2,n1,n2,mode,rval,fl) \ - (*(mp)->m_dm_ops->xfs_send_namesp)(ev,NULL,b1,r1,b2,r2,n1,n2,mode,rval,fl) -#define XFS_SEND_MOUNT(mp,right,path,name) \ - (*(mp)->m_dm_ops->xfs_send_mount)(mp,right,path,name) -#define XFS_SEND_PREUNMOUNT(mp) \ -do { \ - if (mp->m_flags & XFS_MOUNT_DMAPI) { \ - (*(mp)->m_dm_ops->xfs_send_namesp)(DM_EVENT_PREUNMOUNT, mp, \ - (mp)->m_rootip, DM_RIGHT_NULL, \ - (mp)->m_rootip, DM_RIGHT_NULL, \ - NULL, NULL, 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); \ - } \ -} while (0) -#define XFS_SEND_UNMOUNT(mp) \ -do { \ - if (mp->m_flags & XFS_MOUNT_DMAPI) { \ - (*(mp)->m_dm_ops->xfs_send_unmount)(mp, (mp)->m_rootip, \ - DM_RIGHT_NULL, 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); \ - } \ -} while (0) - - #ifdef HAVE_PERCPU_SB /* @@ -440,11 +381,6 @@ extern int xfs_sb_validate_fsb_count(str extern int xfs_dev_is_read_only(struct xfs_mount *, char *); -extern int xfs_dmops_get(struct xfs_mount *); -extern void xfs_dmops_put(struct xfs_mount *); - -extern struct xfs_dmops xfs_dmcore_xfs; - #endif /* __KERNEL__ */ extern void xfs_mod_sb(struct xfs_trans *, __int64_t); Index: b/fs/xfs/xfs_rename.c =================================================================== --- a/fs/xfs/xfs_rename.c +++ b/fs/xfs/xfs_rename.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2003, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -24,7 +24,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" @@ -32,6 +31,7 @@ #include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_dmapi.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_error.h" Index: b/fs/xfs/xfs_rtalloc.c =================================================================== --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: b/fs/xfs/xfs_rw.c =================================================================== --- a/fs/xfs/xfs_rw.c +++ b/fs/xfs/xfs_rw.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * Copyright (c) 2000-2006, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: b/fs/xfs/xfs_trans.c =================================================================== --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2003, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_da_btree.h" Index: b/fs/xfs/xfs_trans_ail.c =================================================================== --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2002, 2005, 2010 SGI * Copyright (c) 2008 Dave Chinner * All Rights Reserved. * @@ -24,7 +24,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trans_priv.h" #include "xfs_error.h" Index: b/fs/xfs/xfs_trans_buf.c =================================================================== --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2002, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: b/fs/xfs/xfs_trans_extfree.c =================================================================== --- a/fs/xfs/xfs_trans_extfree.c +++ b/fs/xfs/xfs_trans_extfree.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000,2005 Silicon Graphics, Inc. + * Copyright (c) 2000, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -23,7 +23,6 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_trans_priv.h" #include "xfs_extfree_item.h" Index: b/fs/xfs/xfs_trans_inode.c =================================================================== --- a/fs/xfs/xfs_trans_inode.c +++ b/fs/xfs/xfs_trans_inode.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000,2005 Silicon Graphics, Inc. + * Copyright (c) 2000, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" Index: b/fs/xfs/xfs_trans_item.c =================================================================== --- a/fs/xfs/xfs_trans_item.c +++ b/fs/xfs/xfs_trans_item.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2002, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -28,7 +28,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" STATIC int xfs_trans_unlock_chunk(xfs_log_item_chunk_t *, Index: b/fs/xfs/xfs_utils.c =================================================================== --- a/fs/xfs/xfs_utils.c +++ b/fs/xfs/xfs_utils.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. + * Copyright (c) 2000-2002, 2005, 2010 SGI * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -25,7 +25,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_dir2_sf.h" Index: b/fs/xfs/xfs_vnodeops.c =================================================================== --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -26,7 +26,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_dir2.h" -#include "xfs_dmapi.h" #include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" @@ -36,6 +35,7 @@ #include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_dmapi.h" #include "xfs_inode_item.h" #include "xfs_itable.h" #include "xfs_btree.h" From aelder@sgi.com Mon Jun 28 17:02: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=unavailable 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 o5SM20Nc044154 for ; Mon, 28 Jun 2010 17:02:00 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay3.corp.sgi.com (Postfix) with ESMTP id 27229AC016; Mon, 28 Jun 2010 15:04:43 -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 o5SM4gNW018115; Mon, 28 Jun 2010 17:04:42 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o5SM4gph018113; Mon, 28 Jun 2010 17:04:42 -0500 From: Alex Elder Message-Id: <201006282204.o5SM4gph018113@stout.americas.sgi.com> Date: Mon, 28 Jun 2010 17:04:42 -0500 To: xfs@oss.sgi.com Subject: [PATCH 02/15] xfs: rename and move definition of HAVE_DMAPI 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 Change the HAVE_DMAPI symbol to be XFS_DMAPI instead, so it is more appropriately restricted to the XFS name space. Move its definition into "xfs_dmapi.h"; the only other file that needs it #includes that file. Signed-off-by: Alex Elder --- fs/xfs/xfs_dmapi.h | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) Index: b/fs/xfs/xfs_dmapi.h =================================================================== --- a/fs/xfs/xfs_dmapi.h +++ b/fs/xfs/xfs_dmapi.h @@ -18,6 +18,11 @@ #ifndef __XFS_DMAPI_H__ #define __XFS_DMAPI_H__ +#undef XFS_DMAPI +#if defined(CONFIG_XFS_DMAPI) || defined(CONFIG_XFS_DMAPI_MODULE) +#define XFS_DMAPI +#endif + /* Values used to define the on-disk version of dm_attrname_t. All * on-disk attribute names start with the 8-byte string "SGI_DMI_". * @@ -66,15 +71,15 @@ typedef enum { #define HAVE_DM_RIGHT_T /* Defines for determining if an event message should be sent. */ -#ifdef HAVE_DMAPI +#ifdef XFS_DMAPI #define DM_EVENT_ENABLED(ip, event) ( \ unlikely ((ip)->i_mount->m_flags & XFS_MOUNT_DMAPI) && \ ( ((ip)->i_d.di_dmevmask & (1 << event)) || \ ((ip)->i_mount->m_dmevmask & (1 << event)) ) \ ) -#else +#else /* ! XFS_DMAPI */ #define DM_EVENT_ENABLED(ip, event) (0) -#endif +#endif /* ! XFS_DMAPI */ #define DM_XFS_VALID_FS_EVENTS ( \ (1 << DM_EVENT_PREUNMOUNT) | \ From aelder@sgi.com Mon Jun 28 17:02:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.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 o5SM2RSb044202 for ; Mon, 28 Jun 2010 17:02:27 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3C6A4AC016; Mon, 28 Jun 2010 15:05:13 -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 o5SM5CXj018152; Mon, 28 Jun 2010 17:05:12 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o5SM5CKp018150; Mon, 28 Jun 2010 17:05:12 -0500 From: Alex Elder Message-Id: <201006282205.o5SM5CKp018150@stout.americas.sgi.com> Date: Mon, 28 Jun 2010 17:05:12 -0500 To: xfs@oss.sgi.com Subject: [PATCH 05/15] xfs: rewrite DMAPI mount macros as functions User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Re-implement XFS_SEND_PREUNMOUNT(), XFS_SEND_MOUNT(), XFS_SEND_UNMOUNT, using real (static inline) functions. In XFS_SEND_MOUNT(), DM_RIGHT_NULL is is the only value passed for "right", so eliminate the argument and hard-code that value instead. Similarly, the "name" is always just the filesystem name recorded in the mount structure, so just use that. Also in XFS_SEND_MOUNT(), there was previously no check for whether XFS_MOUNT_DMAPI is enabled on the file system before dereferencing the m_dm_ops field. Add it, in preparation for eventually allowing that field to be null when DMAPI is not active. As before, if it's not enabled, the event function will return ENOSYS. Signed-off-by: Alex Elder --- fs/xfs/linux-2.6/xfs_super.c | 11 +++++-- fs/xfs/xfs_dmapi.h | 60 ++++++++++++++++++++++++++++++------------- 2 files changed, 50 insertions(+), 21 deletions(-) Index: b/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1206,7 +1206,7 @@ xfs_fs_put_super( xfs_sync_attr(mp, 0); } - XFS_SEND_PREUNMOUNT(mp); + xfs_dmapi_send_preunmount(mp); /* * Blow away any referenced inode in the filestreams cache. @@ -1217,7 +1217,7 @@ xfs_fs_put_super( XFS_bflush(mp->m_ddev_targp); - XFS_SEND_UNMOUNT(mp); + xfs_dmapi_send_unmount(mp); xfs_unmountfs(mp); xfs_freesb(mp); @@ -1607,7 +1607,12 @@ xfs_fs_fill_super( if (error) goto out_filestream_unmount; - XFS_SEND_MOUNT(mp, DM_RIGHT_NULL, mtpt, mp->m_fsname); + /* XXX + * This can return an error--at least ENOMEM and possibly + * others. If that happens, we should probably disable + * DMAPI on the file system or something. + */ + (void) xfs_dmapi_send_mount(mp, mtpt); sb->s_magic = XFS_SB_MAGIC; sb->s_blocksize = mp->m_sb.sb_blocksize; Index: b/fs/xfs/xfs_dmapi.h =================================================================== --- a/fs/xfs/xfs_dmapi.h +++ b/fs/xfs/xfs_dmapi.h @@ -217,23 +217,47 @@ xfs_dmapi_event_enabled(struct xfs_inode (*(mp)->m_dm_ops->xfs_send_destroy)(ip,right) #define XFS_SEND_NAMESP(mp, ev,b1,r1,b2,r2,n1,n2,mode,rval,fl) \ (*(mp)->m_dm_ops->xfs_send_namesp)(ev,NULL,b1,r1,b2,r2,n1,n2,mode,rval,fl) -#define XFS_SEND_MOUNT(mp,right,path,name) \ - (*(mp)->m_dm_ops->xfs_send_mount)(mp,right,path,name) -#define XFS_SEND_PREUNMOUNT(mp) \ -do { \ - if (mp->m_flags & XFS_MOUNT_DMAPI) { \ - (*(mp)->m_dm_ops->xfs_send_namesp)(DM_EVENT_PREUNMOUNT, mp, \ - (mp)->m_rootip, DM_RIGHT_NULL, \ - (mp)->m_rootip, DM_RIGHT_NULL, \ - NULL, NULL, 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); \ - } \ -} while (0) -#define XFS_SEND_UNMOUNT(mp) \ -do { \ - if (mp->m_flags & XFS_MOUNT_DMAPI) { \ - (*(mp)->m_dm_ops->xfs_send_unmount)(mp, (mp)->m_rootip, \ - DM_RIGHT_NULL, 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); \ - } \ -} while (0) + +static inline int +xfs_dmapi_send_mount( + struct xfs_mount *mp, + char *path) +{ + if (mp->m_flags & XFS_MOUNT_DMAPI) { + xfs_send_mount_t send_mount = mp->m_dm_ops->xfs_send_mount; + + return send_mount(mp, DM_RIGHT_NULL, path, mp->m_fsname); + } + + return ENOSYS; +} + + +static inline void +xfs_dmapi_send_preunmount( + struct xfs_mount *mp) +{ + if (mp->m_flags & XFS_MOUNT_DMAPI) { + xfs_send_namesp_t send_namesp = mp->m_dm_ops->xfs_send_namesp; + + (void) send_namesp(DM_EVENT_PREUNMOUNT, mp, + mp->m_rootip, DM_RIGHT_NULL, + mp->m_rootip, DM_RIGHT_NULL, + NULL, NULL, 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); + } +} + +static inline void +xfs_dmapi_send_unmount( + struct xfs_mount *mp) +{ + if (mp->m_flags & XFS_MOUNT_DMAPI) { + xfs_send_unmount_t send_unmount = + mp->m_dm_ops->xfs_send_unmount; + + send_unmount(mp, mp->m_rootip, DM_RIGHT_NULL, + 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); + } +} #endif /* __XFS_DMAPI_H__ */ From aelder@sgi.com Mon Jun 28 17:02: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.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_22 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5SM2btx044213 for ; Mon, 28 Jun 2010 17:02:37 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay1.corp.sgi.com (Postfix) with ESMTP id ECFBB8F80CF; Mon, 28 Jun 2010 15:05:22 -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 o5SM5M2r018163; Mon, 28 Jun 2010 17:05:22 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o5SM5M6w018161; Mon, 28 Jun 2010 17:05:22 -0500 From: Alex Elder Message-Id: <201006282205.o5SM5M6w018161@stout.americas.sgi.com> Date: Mon, 28 Jun 2010 17:05:22 -0500 To: xfs@oss.sgi.com Subject: [PATCH 06/15] xfs: rewrite XFS_SEND_DATA() as a function User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Re-implement XFS_SEND_DATA() using a real (static inline) function. The mount point passed in to XFS_SEND_DATA() is always taken from the i_mount field of an xfs_inode, which is also provided as an argument. Get rid of the mount point argument altogether, and compute what would have been passed within the macro. Make the first argument be the inode "target" of the event being signalled. Also, the implementation of the send data event doesn't side-effect the value whose address is passed in its lock_flags argument. So switch it over to just pass the lock_flags value itself, rather than the address of a variable. Finally, move the test for whether a given event is enabled into the called function. There's a call in xfs_write() that needs to check if the event is enabled before making the call, in order to avoid unnecessarily unlocking and relocking the target inode. Take the branch more generally, whenever (but only when) DMAPI is enabled on the file system; if it is, the second pass is not expensive. Signed-off-by: Alex Elder --- fs/xfs/linux-2.6/xfs_file.c | 41 ++++++++++++++++++----------------------- fs/xfs/xfs_bmap.c | 7 +++---- fs/xfs/xfs_dmapi.h | 22 +++++++++++++++++++--- fs/xfs/xfs_vnodeops.c | 23 ++++++++++------------- 4 files changed, 50 insertions(+), 43 deletions(-) Index: b/fs/xfs/linux-2.6/xfs_file.c =================================================================== --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -275,15 +275,13 @@ xfs_file_aio_read( mutex_lock(&inode->i_mutex); xfs_ilock(ip, XFS_IOLOCK_SHARED); - if (xfs_dmapi_event_enabled(ip, DM_EVENT_READ) && - !(ioflags & IO_INVIS)) { - int iolock = XFS_IOLOCK_SHARED; + if (!(ioflags & IO_INVIS)) { int dmflags = FILP_DELAY_FLAG(file); if (ioflags & IO_ISDIRECT) dmflags |= DM_FLAGS_IMUX; - ret = -XFS_SEND_DATA(mp, DM_EVENT_READ, ip, iocb->ki_pos, size, - dmflags, &iolock); + ret = -xfs_dmapi_send_data(ip, DM_EVENT_READ, iocb->ki_pos, + size, dmflags, XFS_IOLOCK_SHARED); if (ret) { xfs_iunlock(ip, XFS_IOLOCK_SHARED); if (unlikely(ioflags & IO_ISDIRECT)) @@ -338,13 +336,12 @@ xfs_file_splice_read( xfs_ilock(ip, XFS_IOLOCK_SHARED); - if (xfs_dmapi_event_enabled(ip, DM_EVENT_READ) - && !(ioflags & IO_INVIS)) { - int iolock = XFS_IOLOCK_SHARED; + if (!(ioflags & IO_INVIS)) { int error; - error = XFS_SEND_DATA(mp, DM_EVENT_READ, ip, *ppos, count, - FILP_DELAY_FLAG(infilp), &iolock); + error = xfs_dmapi_send_data(ip, DM_EVENT_READ, *ppos, + count, FILP_DELAY_FLAG(infilp), + XFS_IOLOCK_SHARED); if (error) { xfs_iunlock(ip, XFS_IOLOCK_SHARED); return -error; @@ -386,13 +383,12 @@ xfs_file_splice_write( xfs_ilock(ip, XFS_IOLOCK_EXCL); - if (xfs_dmapi_event_enabled(ip, DM_EVENT_WRITE) - && !(ioflags & IO_INVIS)) { - int iolock = XFS_IOLOCK_EXCL; + if (!(ioflags & IO_INVIS)) { int error; - error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, ip, *ppos, count, - FILP_DELAY_FLAG(outfilp), &iolock); + error = xfs_dmapi_send_data(ip, DM_EVENT_WRITE, *ppos, count, + FILP_DELAY_FLAG(outfilp), + XFS_IOLOCK_EXCL); if (error) { xfs_iunlock(ip, XFS_IOLOCK_EXCL); return -error; @@ -678,21 +674,20 @@ start: goto out_unlock_mutex; } - if (xfs_dmapi_event_enabled(ip, DM_EVENT_WRITE) && - !(ioflags & IO_INVIS) && !eventsent) { - int dmflags = FILP_DELAY_FLAG(file); + if (mp->m_flags & XFS_MOUNT_DMAPI && !(ioflags & IO_INVIS) && + !eventsent) { + int dmflags = FILP_DELAY_FLAG(file); if (need_i_mutex) dmflags |= DM_FLAGS_IMUX; xfs_iunlock(ip, XFS_ILOCK_EXCL); - error = XFS_SEND_DATA(ip->i_mount, DM_EVENT_WRITE, ip, - pos, count, dmflags, &iolock); - if (error) { + error = xfs_dmapi_send_data(ip, DM_EVENT_WRITE, + pos, count, dmflags, iolock); + if (error) goto out_unlock_internal; - } - xfs_ilock(ip, XFS_ILOCK_EXCL); eventsent = 1; + xfs_ilock(ip, XFS_ILOCK_EXCL); /* * The iolock was dropped and reacquired in XFS_SEND_DATA Index: b/fs/xfs/xfs_bmap.c =================================================================== --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -5619,10 +5619,9 @@ xfs_getbmap( * could misinterpret holes in a DMAPI file as true holes, * when in fact they may represent offline user data. */ - if (xfs_dmapi_event_enabled(ip, DM_EVENT_READ) && - !(iflags & BMV_IF_NO_DMAPI_READ)) { - error = XFS_SEND_DATA(mp, DM_EVENT_READ, ip, - 0, 0, 0, NULL); + if (!(iflags & BMV_IF_NO_DMAPI_READ)) { + error = xfs_dmapi_send_data(ip, DM_EVENT_READ, + 0, 0, 0, 0); if (error) return XFS_ERROR(error); } Index: b/fs/xfs/xfs_dmapi.h =================================================================== --- a/fs/xfs/xfs_dmapi.h +++ b/fs/xfs/xfs_dmapi.h @@ -166,7 +166,7 @@ extern void xfs_dmops_put(struct xfs_mou extern struct xfs_dmops xfs_dmcore_xfs; typedef int (*xfs_send_data_t)(int, struct xfs_inode *, - xfs_off_t, size_t, int, int *); + xfs_off_t, size_t, int, int); typedef int (*xfs_send_mmap_t)(struct vm_area_struct *, uint); typedef int (*xfs_send_destroy_t)(struct xfs_inode *, dm_right_t); typedef int (*xfs_send_namesp_t)(dm_eventtype_t, struct xfs_mount *, @@ -209,8 +209,24 @@ xfs_dmapi_event_enabled(struct xfs_inode #endif /* ! XFS_DMAPI */ } -#define XFS_SEND_DATA(mp, ev,ip,off,len,fl,lock) \ - (*(mp)->m_dm_ops->xfs_send_data)(ev,ip,off,len,fl,lock) +static inline int +xfs_dmapi_send_data( + struct xfs_inode *ip, + dm_eventtype_t event, + xfs_off_t offset, + size_t length, + int flags, + int lock_flags) +{ + xfs_send_data_t send_data; + + if (! xfs_dmapi_event_enabled(ip, event)) + return 0; + send_data = ip->i_mount->m_dm_ops->xfs_send_data; + + return send_data(event, ip, offset, length, flags, lock_flags); +} + #define XFS_SEND_MMAP(mp, vma,fl) \ (*(mp)->m_dm_ops->xfs_send_mmap)(vma,fl) #define XFS_SEND_DESTROY(mp, ip,right) \ Index: b/fs/xfs/xfs_vnodeops.c =================================================================== --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -143,13 +143,12 @@ xfs_setattr( goto error_return; } } else { - if (xfs_dmapi_event_enabled(ip, DM_EVENT_TRUNCATE) && - !(flags & XFS_ATTR_DMI)) { + if (!(flags & XFS_ATTR_DMI)) { int dmflags = AT_DELAY_FLAG(flags); dmflags |= DM_FLAGS_IALLOCSEM_WR|DM_FLAGS_IMUX; - code = XFS_SEND_DATA(mp, DM_EVENT_TRUNCATE, ip, - iattr->ia_size, 0, dmflags, NULL); + code = xfs_dmapi_send_data(ip, DM_EVENT_TRUNCATE, + iattr->ia_size, 0, dmflags, 0); if (code) { lock_flags = 0; goto error_return; @@ -2417,15 +2416,14 @@ xfs_alloc_file_space( /* Generate a DMAPI event if needed. */ if (alloc_type != 0 && offset < ip->i_size && - (attr_flags & XFS_ATTR_DMI) == 0 && - xfs_dmapi_event_enabled(ip, DM_EVENT_WRITE)) { + (attr_flags & XFS_ATTR_DMI) == 0) { xfs_off_t end_dmi_offset; end_dmi_offset = offset+len; if (end_dmi_offset > ip->i_size) end_dmi_offset = ip->i_size; - error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, ip, offset, - end_dmi_offset - offset, 0, NULL); + error = xfs_dmapi_send_data(ip, DM_EVENT_WRITE, offset, + end_dmi_offset - offset, 0, 0); if (error) return error; } @@ -2691,19 +2689,18 @@ xfs_free_file_space( error = 0; if (len <= 0) /* if nothing being freed */ - return error; + return 0; rt = XFS_IS_REALTIME_INODE(ip); startoffset_fsb = XFS_B_TO_FSB(mp, offset); end_dmi_offset = offset + len; endoffset_fsb = XFS_B_TO_FSBT(mp, end_dmi_offset); - if (offset < ip->i_size && (attr_flags & XFS_ATTR_DMI) == 0 && - xfs_dmapi_event_enabled(ip, DM_EVENT_WRITE)) { + if (offset < ip->i_size && (attr_flags & XFS_ATTR_DMI) == 0) { if (end_dmi_offset > ip->i_size) end_dmi_offset = ip->i_size; - error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, ip, + error = xfs_dmapi_send_data(ip, DM_EVENT_WRITE, offset, end_dmi_offset - offset, - AT_DELAY_FLAG(attr_flags), NULL); + AT_DELAY_FLAG(attr_flags), 0); if (error) return error; } From aelder@sgi.com Mon Jun 28 17:02: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 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 o5SM2p6X044268 for ; Mon, 28 Jun 2010 17:02:52 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4F9C3AC016; Mon, 28 Jun 2010 15:05:33 -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 o5SM5W7P018171; Mon, 28 Jun 2010 17:05:32 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o5SM5Wps018169; Mon, 28 Jun 2010 17:05:32 -0500 From: Alex Elder Message-Id: <201006282205.o5SM5Wps018169@stout.americas.sgi.com> Date: Mon, 28 Jun 2010 17:05:32 -0500 To: xfs@oss.sgi.com Subject: [PATCH 07/15] xfs: rewrite XFS_SEND_MMAP() as a function User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Re-implement XFS_SEND_MMAP() using a real (static inline) function. The mount point passed in to XFS_SEND_MMAP() is always derived from from the vma struct that is the subject of VM operation. Get rid of the mount point argument altogether, and compute what would have been passed within the macro, making the first argument the vma "target" of the event being signalled. Finally, move the checks for whether an event is enabled into the called function. Signed-off-by: Alex Elder --- fs/xfs/xfs_dmapi.h | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) Index: b/fs/xfs/xfs_dmapi.h =================================================================== --- a/fs/xfs/xfs_dmapi.h +++ b/fs/xfs/xfs_dmapi.h @@ -227,8 +227,24 @@ xfs_dmapi_send_data( return send_data(event, ip, offset, length, flags, lock_flags); } -#define XFS_SEND_MMAP(mp, vma,fl) \ - (*(mp)->m_dm_ops->xfs_send_mmap)(vma,fl) +static inline int +xfs_dmapi_send_mmap( + struct vm_area_struct *vma, + unsigned long vm_flags) +{ + struct inode *inode = vma->vm_file->f_path.dentry->d_inode; + struct xfs_mount *mp = XFS_M(inode->i_sb); + + if (mp->m_flags & XFS_MOUNT_DMAPI) { + xfs_send_mmap_t send_mmap = mp->m_dm_ops->xfs_send_mmap; + + return send_mmap(vma, vm_flags); + } + ASSERT_ALWAYS(vm_flags == VM_WRITE); + + return 0; +} + #define XFS_SEND_DESTROY(mp, ip,right) \ (*(mp)->m_dm_ops->xfs_send_destroy)(ip,right) #define XFS_SEND_NAMESP(mp, ev,b1,r1,b2,r2,n1,n2,mode,rval,fl) \ From aelder@sgi.com Mon Jun 28 17:02:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from 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 o5SM2vYh044289 for ; Mon, 28 Jun 2010 17:02:57 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3AFABAC020; Mon, 28 Jun 2010 15:05:43 -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 o5SM5gwx018179; Mon, 28 Jun 2010 17:05:42 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o5SM5g24018177; Mon, 28 Jun 2010 17:05:42 -0500 From: Alex Elder Message-Id: <201006282205.o5SM5g24018177@stout.americas.sgi.com> Date: Mon, 28 Jun 2010 17:05:42 -0500 To: xfs@oss.sgi.com Subject: [PATCH 08/15] xfs: rewrite XFS_SEND_DESTROY() as a function User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Re-implement XFS_SEND_DESTROY() using a real (static inline) function. The mount point passed in to XFS_SEND_DESTROY() is always taken from the i_mount field of the xfs_inode which is also provided. Get rid of the mount point argument altogether, and compute what would have been passed within the macro. Finally, move the test for whether the event is enabled into the called function. Signed-off-by: Alex Elder --- fs/xfs/xfs_dmapi.h | 16 ++++++++++++++-- fs/xfs/xfs_vnodeops.c | 5 ++--- 2 files changed, 16 insertions(+), 5 deletions(-) Index: b/fs/xfs/xfs_dmapi.h =================================================================== --- a/fs/xfs/xfs_dmapi.h +++ b/fs/xfs/xfs_dmapi.h @@ -245,8 +245,20 @@ xfs_dmapi_send_mmap( return 0; } -#define XFS_SEND_DESTROY(mp, ip,right) \ - (*(mp)->m_dm_ops->xfs_send_destroy)(ip,right) +static inline int +xfs_dmapi_send_destroy( + struct xfs_inode *ip, + dm_right_t right) +{ + xfs_send_destroy_t send_destroy; + + if (!xfs_dmapi_event_enabled(ip, DM_EVENT_DESTROY)) + return 0; + send_destroy = ip->i_mount->m_dm_ops->xfs_send_destroy; + + return send_destroy(ip, right); +} + #define XFS_SEND_NAMESP(mp, ev,b1,r1,b2,r2,n1,n2,mode,rval,fl) \ (*(mp)->m_dm_ops->xfs_send_namesp)(ev,NULL,b1,r1,b2,r2,n1,n2,mode,rval,fl) Index: b/fs/xfs/xfs_vnodeops.c =================================================================== --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -1061,9 +1061,8 @@ xfs_inactive( mp = ip->i_mount; - if (ip->i_d.di_nlink == 0 && - xfs_dmapi_event_enabled(ip, DM_EVENT_DESTROY)) - XFS_SEND_DESTROY(mp, ip, DM_RIGHT_NULL); + if (ip->i_d.di_nlink == 0) + (void) xfs_dmapi_send_destroy(ip, DM_RIGHT_NULL); error = 0; From aelder@sgi.com Mon Jun 28 17:03: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 relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5SM37mN044306 for ; Mon, 28 Jun 2010 17:03:07 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay2.corp.sgi.com (Postfix) with ESMTP id F3B61304048; Mon, 28 Jun 2010 15:05:52 -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 o5SM5qbP018196; Mon, 28 Jun 2010 17:05:52 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o5SM5qNZ018194; Mon, 28 Jun 2010 17:05:52 -0500 From: Alex Elder Message-Id: <201006282205.o5SM5qNZ018194@stout.americas.sgi.com> Date: Mon, 28 Jun 2010 17:05:52 -0500 To: xfs@oss.sgi.com Subject: [PATCH 09/15] xfs: rewrite XFS_SEND_NAMESP() as a function User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Re-implement XFS_SEND_NAMESP() using a real (static inline) function. The mount point passed in to XFS_SEND_NAMESP() is always taken from the i_mount field of the first xfs_inode which is also provided. (If two inodes are passed they need to reside in the same filesystem.) Get rid of the mount point argument altogether, and compute what would have been passed within the macro, making the first argument be the inode "target" of the event being signalled. Rearrange the arguments to the XFS_SEND_NAMESP() macro to be more regular, since they're a little wonky. Finally, move the test for whether a given event is enabled into the called function. In a few cases this depends on both inodes rather than just the first, so this ends up being more involved, but I think it's better to hide these details. Note that there also a call in xfs_file_aio_write() that needs to check if the event is enabled before making the call, in order to avoid unnecessarily unlocking and relocking the target inode. Take the branch more generally when DMAPI is enabled on the file system. This should be an unusual case (ENOSPC), so we'll not worry about the extra overhead. Signed-off-by: Alex Elder --- fs/xfs/linux-2.6/xfs_file.c | 8 +-- fs/xfs/linux-2.6/xfs_ioctl.c | 9 +-- fs/xfs/xfs_dmapi.h | 69 ++++++++++++++++++++++---- fs/xfs/xfs_rename.c | 29 ++++------- fs/xfs/xfs_vnodeops.c | 112 ++++++++++++++++++------------------------- 5 files changed, 126 insertions(+), 101 deletions(-) Index: b/fs/xfs/linux-2.6/xfs_file.c =================================================================== --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -830,14 +830,14 @@ write_retry: xfs_iunlock(ip, XFS_ILOCK_EXCL); } - if (ret == -ENOSPC && - xfs_dmapi_event_enabled(ip, DM_EVENT_NOSPACE) && + if (ret == -ENOSPC && mp->m_flags & XFS_MOUNT_DMAPI && !(ioflags & IO_INVIS)) { xfs_iunlock(ip, iolock); if (need_i_mutex) mutex_unlock(&inode->i_mutex); - error = XFS_SEND_NAMESP(ip->i_mount, DM_EVENT_NOSPACE, ip, - DM_RIGHT_NULL, ip, DM_RIGHT_NULL, NULL, NULL, + error = xfs_dmapi_send_namesp(xip, DM_RIGHT_NULL, NULL, + DM_EVENT_NOSPACE, + xip, DM_RIGHT_NULL, NULL, 0, 0, 0); /* Delay flag intentionally unused */ if (need_i_mutex) mutex_lock(&inode->i_mutex); Index: b/fs/xfs/linux-2.6/xfs_ioctl.c =================================================================== --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c @@ -1120,11 +1120,10 @@ xfs_ioctl_setattr( if (code) return code; - if (xfs_dmapi_event_enabled(ip, DM_EVENT_ATTRIBUTE)) { - XFS_SEND_NAMESP(mp, DM_EVENT_ATTRIBUTE, ip, DM_RIGHT_NULL, - NULL, DM_RIGHT_NULL, NULL, NULL, 0, 0, - (mask & FSX_NONBLOCK) ? DM_FLAGS_NDELAY : 0); - } + (void) xfs_dmapi_send_namesp(ip, DM_RIGHT_NULL, NULL, + DM_EVENT_ATTRIBUTE, + NULL, DM_RIGHT_NULL, NULL, + 0, 0, (mask & FSX_NONBLOCK) ? DM_FLAGS_NDELAY : 0); return 0; Index: b/fs/xfs/xfs_dmapi.h =================================================================== --- a/fs/xfs/xfs_dmapi.h +++ b/fs/xfs/xfs_dmapi.h @@ -259,8 +259,60 @@ xfs_dmapi_send_destroy( return send_destroy(ip, right); } -#define XFS_SEND_NAMESP(mp, ev,b1,r1,b2,r2,n1,n2,mode,rval,fl) \ - (*(mp)->m_dm_ops->xfs_send_namesp)(ev,NULL,b1,r1,b2,r2,n1,n2,mode,rval,fl) +static inline int +xfs_dmapi_send_namesp( + struct xfs_inode *ip1, + dm_right_t right1, + const char *name1, + dm_eventtype_t event, + struct xfs_inode *ip2, + dm_right_t right2, + const char *name2, + mode_t mode, + int ret, + int flags) +{ + int enabled; + xfs_send_namesp_t send_namesp; + + ASSERT(ip1 != NULL); + if (ip2 && ip1->i_mount != ip2->i_mount) + return -EINVAL; + + switch (event) { + case DM_EVENT_PREUNMOUNT: /* xfs_dmapi_send_preunmount() */ + enabled = 1; + break; + case DM_EVENT_CREATE: + case DM_EVENT_POSTCREATE: + case DM_EVENT_REMOVE: + case DM_EVENT_POSTREMOVE: + case DM_EVENT_LINK: + case DM_EVENT_POSTLINK: + case DM_EVENT_SYMLINK: + case DM_EVENT_POSTSYMLINK: + case DM_EVENT_ATTRIBUTE: + case DM_EVENT_NOSPACE: + enabled = xfs_dmapi_event_enabled(ip1, event); + break; + case DM_EVENT_RENAME: + case DM_EVENT_POSTRENAME: + enabled = xfs_dmapi_event_enabled(ip1, event) || + xfs_dmapi_event_enabled(ip2, event); + break; + default: + ASSERT(0); + enabled = 0; + break; + } + if (!enabled) + return 0; + + send_namesp = ip1->i_mount->m_dm_ops->xfs_send_namesp; + + return send_namesp(event, NULL, ip1, right1, ip2, right2, + name1, name2, mode, ret, flags); +} static inline int xfs_dmapi_send_mount( @@ -281,14 +333,11 @@ static inline void xfs_dmapi_send_preunmount( struct xfs_mount *mp) { - if (mp->m_flags & XFS_MOUNT_DMAPI) { - xfs_send_namesp_t send_namesp = mp->m_dm_ops->xfs_send_namesp; - - (void) send_namesp(DM_EVENT_PREUNMOUNT, mp, - mp->m_rootip, DM_RIGHT_NULL, - mp->m_rootip, DM_RIGHT_NULL, - NULL, NULL, 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); - } + if (mp->m_flags & XFS_MOUNT_DMAPI) + (void) xfs_dmapi_send_namesp(mp->m_rootip, DM_RIGHT_NULL, NULL, + DM_EVENT_PREUNMOUNT, + mp->m_rootip, DM_RIGHT_NULL, NULL, + 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); } static inline void Index: b/fs/xfs/xfs_rename.c =================================================================== --- a/fs/xfs/xfs_rename.c +++ b/fs/xfs/xfs_rename.c @@ -119,16 +119,13 @@ xfs_rename( xfs_itrace_entry(src_dp); xfs_itrace_entry(target_dp); - if (xfs_dmapi_event_enabled(src_dp, DM_EVENT_RENAME) || - xfs_dmapi_event_enabled(target_dp, DM_EVENT_RENAME)) { - error = XFS_SEND_NAMESP(mp, DM_EVENT_RENAME, - src_dp, DM_RIGHT_NULL, - target_dp, DM_RIGHT_NULL, - src_name->name, target_name->name, - 0, 0, 0); - if (error) - return error; - } + error = xfs_dmapi_send_namesp(src_dp, DM_RIGHT_NULL, src_name->name, + DM_EVENT_RENAME, + target_dp, DM_RIGHT_NULL, target_name->name, + 0, 0, 0); + if (error) + return error; + /* Return through std_return after this point. */ new_parent = (src_dp != target_dp); @@ -374,14 +371,10 @@ xfs_rename( /* Fall through to std_return with error = 0 or errno from * xfs_trans_commit */ std_return: - if (xfs_dmapi_event_enabled(src_dp, DM_EVENT_POSTRENAME) || - xfs_dmapi_event_enabled(target_dp, DM_EVENT_POSTRENAME)) { - (void) XFS_SEND_NAMESP (mp, DM_EVENT_POSTRENAME, - src_dp, DM_RIGHT_NULL, - target_dp, DM_RIGHT_NULL, - src_name->name, target_name->name, - 0, error, 0); - } + (void) xfs_dmapi_send_namesp(src_dp, DM_RIGHT_NULL, src_name->name, + DM_EVENT_POSTRENAME, + target_dp, DM_RIGHT_NULL, target_name->name, + 0, error, 0); return error; abort_return: Index: b/fs/xfs/xfs_vnodeops.c =================================================================== --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -471,10 +471,10 @@ xfs_setattr( return XFS_ERROR(code); } - if (xfs_dmapi_event_enabled(ip, DM_EVENT_ATTRIBUTE) && - !(flags & XFS_ATTR_DMI)) { - (void) XFS_SEND_NAMESP(mp, DM_EVENT_ATTRIBUTE, ip, DM_RIGHT_NULL, - NULL, DM_RIGHT_NULL, NULL, NULL, + if (!(flags & XFS_ATTR_DMI)) { + (void) xfs_dmapi_send_namesp(ip, DM_RIGHT_NULL, NULL, + DM_EVENT_ATTRIBUTE, + NULL, DM_RIGHT_NULL, NULL, 0, 0, AT_DELAY_FLAG(flags)); } return 0; @@ -1315,15 +1315,12 @@ xfs_create( if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); - if (xfs_dmapi_event_enabled(dp, DM_EVENT_CREATE)) { - error = XFS_SEND_NAMESP(mp, DM_EVENT_CREATE, - dp, DM_RIGHT_NULL, NULL, - DM_RIGHT_NULL, name->name, NULL, + error = xfs_dmapi_send_namesp(dp, DM_RIGHT_NULL, name->name, + DM_EVENT_CREATE, + NULL, DM_RIGHT_NULL, NULL, mode, 0, 0); - - if (error) - return error; - } + if (error) + return error; if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) prid = dp->i_d.di_projid; @@ -1491,11 +1488,10 @@ xfs_create( /* Fallthrough to std_return with error = 0 */ std_return: - if (xfs_dmapi_event_enabled(dp, DM_EVENT_POSTCREATE)) { - XFS_SEND_NAMESP(mp, DM_EVENT_POSTCREATE, dp, DM_RIGHT_NULL, - ip, DM_RIGHT_NULL, name->name, NULL, mode, - error, 0); - } + (void) xfs_dmapi_send_namesp(dp, DM_RIGHT_NULL, name->name, + DM_EVENT_POSTCREATE, + ip, DM_RIGHT_NULL, NULL, + mode, error, 0); return error; @@ -1733,13 +1729,12 @@ xfs_remove( if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); - if (xfs_dmapi_event_enabled(dp, DM_EVENT_REMOVE)) { - error = XFS_SEND_NAMESP(mp, DM_EVENT_REMOVE, dp, DM_RIGHT_NULL, - NULL, DM_RIGHT_NULL, name->name, NULL, - ip->i_d.di_mode, 0, 0); - if (error) - return error; - } + error = xfs_dmapi_send_namesp(dp, DM_RIGHT_NULL, name->name, + DM_EVENT_REMOVE, + NULL, DM_RIGHT_NULL, NULL, + ip->i_d.di_mode, 0, 0); + if (error) + return error; error = xfs_qm_dqattach(dp, 0); if (error) @@ -1879,11 +1874,10 @@ xfs_remove( xfs_filestream_deassociate(ip); std_return: - if (xfs_dmapi_event_enabled(dp, DM_EVENT_POSTREMOVE)) { - XFS_SEND_NAMESP(mp, DM_EVENT_POSTREMOVE, dp, DM_RIGHT_NULL, - NULL, DM_RIGHT_NULL, name->name, NULL, + (void) xfs_dmapi_send_namesp(dp, DM_RIGHT_NULL, name->name, + DM_EVENT_POSTREMOVE, + NULL, DM_RIGHT_NULL, NULL, ip->i_d.di_mode, error, 0); - } return error; @@ -1918,14 +1912,12 @@ xfs_link( if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); - if (xfs_dmapi_event_enabled(tdp, DM_EVENT_LINK)) { - error = XFS_SEND_NAMESP(mp, DM_EVENT_LINK, - tdp, DM_RIGHT_NULL, - sip, DM_RIGHT_NULL, - target_name->name, NULL, 0, 0, 0); - if (error) - return error; - } + error = xfs_dmapi_send_namesp(tdp, DM_RIGHT_NULL, target_name->name, + DM_EVENT_LINK, + sip, DM_RIGHT_NULL, NULL, + 0, 0, 0); + if (error) + return error; /* Return through std_return after this point. */ @@ -2021,12 +2013,11 @@ xfs_link( /* Fall through to std_return with error = 0. */ std_return: - if (xfs_dmapi_event_enabled(sip, DM_EVENT_POSTLINK)) { - (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTLINK, - tdp, DM_RIGHT_NULL, - sip, DM_RIGHT_NULL, - target_name->name, NULL, 0, error, 0); - } + (void) xfs_dmapi_send_namesp(tdp, DM_RIGHT_NULL, target_name->name, + DM_EVENT_POSTLINK, + sip, DM_RIGHT_NULL, NULL, + 0, error, 0); + return error; abort_return: @@ -2087,14 +2078,12 @@ xfs_symlink( if (pathlen >= MAXPATHLEN) /* total string too long */ return XFS_ERROR(ENAMETOOLONG); - if (xfs_dmapi_event_enabled(dp, DM_EVENT_SYMLINK)) { - error = XFS_SEND_NAMESP(mp, DM_EVENT_SYMLINK, dp, - DM_RIGHT_NULL, NULL, DM_RIGHT_NULL, - link_name->name, - (unsigned char *)target_path, 0, 0, 0); - if (error) - return error; - } + error = xfs_dmapi_send_namesp(dp, DM_RIGHT_NULL, link_name->name, + DM_EVENT_SYMLINK, + NULL, DM_RIGHT_NULL, + (unsigned char *)target_path, 0, 0, 0); + if (error) + return error; /* Return through std_return after this point. */ @@ -2282,14 +2271,10 @@ xfs_symlink( /* Fall through to std_return with error = 0 or errno from * xfs_trans_commit */ std_return: - if (xfs_dmapi_event_enabled(dp, DM_EVENT_POSTSYMLINK)) { - (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTSYMLINK, - dp, DM_RIGHT_NULL, - error ? NULL : ip, - DM_RIGHT_NULL, link_name->name, - (unsigned char *)target_path, - 0, error, 0); - } + (void) xfs_dmapi_send_namesp(dp, DM_RIGHT_NULL, link_name->name, + DM_EVENT_POSTSYMLINK, + error ? NULL : ip, DM_RIGHT_NULL, + (unsigned char *) target_path, 0, error, 0); if (!error) *ipp = ip; @@ -2528,12 +2513,11 @@ retry: allocatesize_fsb -= allocated_fsb; } dmapi_enospc_check: - if (error == ENOSPC && (attr_flags & XFS_ATTR_DMI) == 0 && - xfs_dmapi_event_enabled(ip, DM_EVENT_NOSPACE)) { - error = XFS_SEND_NAMESP(mp, DM_EVENT_NOSPACE, - ip, DM_RIGHT_NULL, - ip, DM_RIGHT_NULL, - NULL, NULL, 0, 0, 0); /* Delay flag intentionally unused */ + if (error == ENOSPC && (attr_flags & XFS_ATTR_DMI) == 0) { + error = xfs_dmapi_send_namesp(ip, DM_RIGHT_NULL, NULL, + DM_EVENT_NOSPACE, + ip, DM_RIGHT_NULL, NULL, + 0, 0, 0); /* Delay flag intentionally unused */ if (error == 0) goto retry; /* Maybe DMAPI app. has made space */ /* else fall through with error from XFS_SEND_DATA */ From aelder@sgi.com Mon Jun 28 17:03: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=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5SM3HMe044324 for ; Mon, 28 Jun 2010 17:03:17 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay1.corp.sgi.com (Postfix) with ESMTP id 029CA8F80B7; Mon, 28 Jun 2010 15:06:03 -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 o5SM62Xc018203; Mon, 28 Jun 2010 17:06:02 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o5SM62Hg018201; Mon, 28 Jun 2010 17:06:02 -0500 From: Alex Elder Message-Id: <201006282206.o5SM62Hg018201@stout.americas.sgi.com> Date: Mon, 28 Jun 2010 17:06:02 -0500 To: xfs@oss.sgi.com Subject: [PATCH 10/15] xfs: kill xfs_dmcore_stub 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 Nobody ever dereferences an XFS mount point's m_dm_ops vector pointer any more unless the XFS_MOUNT_DMAPI mount flag is set. So leverage that to just use a null pointer there in that case, and drop the whole xfs_dmcore_stub variable. Change it so that once the m_dm_ops vector has had a chance to be assigned at mount time, a non-null m_vm_ops pointer is always used to indicate DMAPI is active on a file system rather than looking at the mount flag. Also rearrange the logic in xfs_dmops_get() a bit to avoid including much of the code in the case DMAPI isn't supported at build time. Signed-off-by: Alex Elder --- fs/xfs/linux-2.6/xfs_file.c | 6 ++---- fs/xfs/xfs_dmapi.h | 10 +++++----- fs/xfs/xfs_dmops.c | 37 +++++++++++++++++++++---------------- 3 files changed, 28 insertions(+), 25 deletions(-) Index: b/fs/xfs/linux-2.6/xfs_file.c =================================================================== --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -674,8 +674,7 @@ start: goto out_unlock_mutex; } - if (mp->m_flags & XFS_MOUNT_DMAPI && !(ioflags & IO_INVIS) && - !eventsent) { + if (mp->m_dm_ops && !(ioflags & IO_INVIS) && !eventsent) { int dmflags = FILP_DELAY_FLAG(file); if (need_i_mutex) @@ -830,8 +829,7 @@ write_retry: xfs_iunlock(ip, XFS_ILOCK_EXCL); } - if (ret == -ENOSPC && mp->m_flags & XFS_MOUNT_DMAPI && - !(ioflags & IO_INVIS)) { + if (ret == -ENOSPC && mp->m_dm_ops && !(ioflags & IO_INVIS)) { xfs_iunlock(ip, iolock); if (need_i_mutex) mutex_unlock(&inode->i_mutex); Index: b/fs/xfs/xfs_dmapi.h =================================================================== --- a/fs/xfs/xfs_dmapi.h +++ b/fs/xfs/xfs_dmapi.h @@ -201,7 +201,7 @@ xfs_dmapi_event_enabled(struct xfs_inode #ifdef XFS_DMAPI unsigned int event_mask = 1 << event; - return ip->i_mount->m_flags & XFS_MOUNT_DMAPI && + return ip->i_mount->m_dm_ops && (ip->i_mount->m_dmevmask & event_mask || ip->i_d.di_dmevmask & event_mask); #else /* ! XFS_DMAPI */ @@ -235,7 +235,7 @@ xfs_dmapi_send_mmap( struct inode *inode = vma->vm_file->f_path.dentry->d_inode; struct xfs_mount *mp = XFS_M(inode->i_sb); - if (mp->m_flags & XFS_MOUNT_DMAPI) { + if (mp->m_dm_ops) { xfs_send_mmap_t send_mmap = mp->m_dm_ops->xfs_send_mmap; return send_mmap(vma, vm_flags); @@ -319,7 +319,7 @@ xfs_dmapi_send_mount( struct xfs_mount *mp, char *path) { - if (mp->m_flags & XFS_MOUNT_DMAPI) { + if (mp->m_dm_ops) { xfs_send_mount_t send_mount = mp->m_dm_ops->xfs_send_mount; return send_mount(mp, DM_RIGHT_NULL, path, mp->m_fsname); @@ -333,7 +333,7 @@ static inline void xfs_dmapi_send_preunmount( struct xfs_mount *mp) { - if (mp->m_flags & XFS_MOUNT_DMAPI) + if (mp->m_dm_ops) (void) xfs_dmapi_send_namesp(mp->m_rootip, DM_RIGHT_NULL, NULL, DM_EVENT_PREUNMOUNT, mp->m_rootip, DM_RIGHT_NULL, NULL, @@ -344,7 +344,7 @@ static inline void xfs_dmapi_send_unmount( struct xfs_mount *mp) { - if (mp->m_flags & XFS_MOUNT_DMAPI) { + if (mp->m_dm_ops) { xfs_send_unmount_t send_unmount = mp->m_dm_ops->xfs_send_unmount; Index: b/fs/xfs/xfs_dmops.c =================================================================== --- a/fs/xfs/xfs_dmops.c +++ b/fs/xfs/xfs_dmops.c @@ -28,30 +28,35 @@ #include "xfs_inode.h" #include "xfs_dmapi.h" - -static struct xfs_dmops xfs_dmcore_stub = { - .xfs_send_data = (xfs_send_data_t)fs_nosys, - .xfs_send_mmap = (xfs_send_mmap_t)fs_noerr, - .xfs_send_destroy = (xfs_send_destroy_t)fs_nosys, - .xfs_send_namesp = (xfs_send_namesp_t)fs_nosys, - .xfs_send_mount = (xfs_send_mount_t)fs_nosys, - .xfs_send_unmount = (xfs_send_unmount_t)fs_noerr, -}; - int xfs_dmops_get(struct xfs_mount *mp) { - if (mp->m_flags & XFS_MOUNT_DMAPI) { - cmn_err(CE_WARN, - "XFS: dmapi support not available in this kernel."); - return EINVAL; + ASSERT(!mp->m_dm_ops); + if (!(mp->m_flags & XFS_MOUNT_DMAPI)) + return 0; + +#ifdef XFS_DMAPI + mp->m_dm_ops = symbol_get(xfs_dmcore_xfs); + if (!mp->m_dm_ops) { + request_module("xfs_dmapi"); + mp->m_dm_ops = symbol_get(xfs_dmcore_xfs); } + if (mp->m_dm_ops) + return 0; +#endif /* XFS_DMAPI */ - mp->m_dm_ops = &xfs_dmcore_stub; - return 0; + /* Turn off the flag, since it won't be operative */ + mp->m_flags &= ~XFS_MOUNT_DMAPI; + cmn_err(CE_WARN, "XFS: dmapi support not available in this kernel."); + + return EINVAL; } void xfs_dmops_put(struct xfs_mount *mp) { + if (mp->m_dm_ops) { + symbol_put(xfs_dmcore_xfs); + mp->m_dm_ops = NULL; + } } From aelder@sgi.com Mon Jun 28 17:03: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.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5SM3R0X044342 for ; Mon, 28 Jun 2010 17:03:27 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay1.corp.sgi.com (Postfix) with ESMTP id 075448F80B7; Mon, 28 Jun 2010 15:06:13 -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 o5SM6CrF018214; Mon, 28 Jun 2010 17:06:12 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o5SM6CDs018212; Mon, 28 Jun 2010 17:06:12 -0500 From: Alex Elder Message-Id: <201006282206.o5SM6CDs018212@stout.americas.sgi.com> Date: Mon, 28 Jun 2010 17:06:12 -0500 To: xfs@oss.sgi.com Subject: [PATCH 11/15] xfs: create DMAPI event functions 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 Create customized functions that implement making the DMAPI event calls, one for each event type needed. These functions will only take the arguments that are required, and will hide the details of passing various constant values to the "standard" XFS DMAPI interfaces. Also kill off two macros, FILP_DELAY_FLAG() and AT_DELAY_FLAG(), which are only used in a few places and which can easily be expanded in-line. In the read, write, and truncate event cases, arrange for the interface to allow the caller to specify the conditions that would require particular DMAPI flags to be used, rather than specifying the DMAPI flags themselves. Signed-off-by Alex Elder --- fs/xfs/linux-2.6/xfs_file.c | 40 ++---- fs/xfs/linux-2.6/xfs_ioctl.c | 5 fs/xfs/linux-2.6/xfs_super.c | 6 fs/xfs/xfs_bmap.c | 3 fs/xfs/xfs_dmapi.h | 259 +++++++++++++++++++++++++++++++++++++++++-- fs/xfs/xfs_rename.c | 12 - fs/xfs/xfs_vnodeops.c | 76 +++--------- 7 files changed, 296 insertions(+), 105 deletions(-) Index: b/fs/xfs/linux-2.6/xfs_file.c =================================================================== --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c @@ -276,12 +276,9 @@ xfs_file_aio_read( xfs_ilock(ip, XFS_IOLOCK_SHARED); if (!(ioflags & IO_INVIS)) { - int dmflags = FILP_DELAY_FLAG(file); - - if (ioflags & IO_ISDIRECT) - dmflags |= DM_FLAGS_IMUX; - ret = -xfs_dmapi_send_data(ip, DM_EVENT_READ, iocb->ki_pos, - size, dmflags, XFS_IOLOCK_SHARED); + ret = -xfs_dmapi_event_read(ip, iocb->ki_pos, size, + file->f_flags & (O_NDELAY|O_NONBLOCK), + ioflags & IO_ISDIRECT, XFS_IOLOCK_SHARED); if (ret) { xfs_iunlock(ip, XFS_IOLOCK_SHARED); if (unlikely(ioflags & IO_ISDIRECT)) @@ -322,7 +319,6 @@ xfs_file_splice_read( unsigned int flags) { struct xfs_inode *ip = XFS_I(infilp->f_mapping->host); - struct xfs_mount *mp = ip->i_mount; int ioflags = 0; ssize_t ret; @@ -339,9 +335,9 @@ xfs_file_splice_read( if (!(ioflags & IO_INVIS)) { int error; - error = xfs_dmapi_send_data(ip, DM_EVENT_READ, *ppos, - count, FILP_DELAY_FLAG(infilp), - XFS_IOLOCK_SHARED); + error = xfs_dmapi_event_read(ip, *ppos, count, + infilp->f_flags & (O_NDELAY|O_NONBLOCK), + 0, XFS_IOLOCK_SHARED); if (error) { xfs_iunlock(ip, XFS_IOLOCK_SHARED); return -error; @@ -368,7 +364,6 @@ xfs_file_splice_write( { struct inode *inode = outfilp->f_mapping->host; struct xfs_inode *ip = XFS_I(inode); - struct xfs_mount *mp = ip->i_mount; xfs_fsize_t isize, new_size; int ioflags = 0; ssize_t ret; @@ -386,9 +381,9 @@ xfs_file_splice_write( if (!(ioflags & IO_INVIS)) { int error; - error = xfs_dmapi_send_data(ip, DM_EVENT_WRITE, *ppos, count, - FILP_DELAY_FLAG(outfilp), - XFS_IOLOCK_EXCL); + error = xfs_dmapi_event_write(ip, *ppos, count, + outfilp->f_flags & (O_NDELAY|O_NONBLOCK), + 0, XFS_IOLOCK_EXCL); if (error) { xfs_iunlock(ip, XFS_IOLOCK_EXCL); return -error; @@ -675,14 +670,10 @@ start: } if (mp->m_dm_ops && !(ioflags & IO_INVIS) && !eventsent) { - int dmflags = FILP_DELAY_FLAG(file); - - if (need_i_mutex) - dmflags |= DM_FLAGS_IMUX; - xfs_iunlock(ip, XFS_ILOCK_EXCL); - error = xfs_dmapi_send_data(ip, DM_EVENT_WRITE, - pos, count, dmflags, iolock); + error = xfs_dmapi_event_write(ip, pos, count, + file->f_flags & (O_NDELAY|O_NONBLOCK), + need_i_mutex, iolock); if (error) goto out_unlock_internal; eventsent = 1; @@ -833,10 +824,9 @@ write_retry: xfs_iunlock(ip, iolock); if (need_i_mutex) mutex_unlock(&inode->i_mutex); - error = xfs_dmapi_send_namesp(xip, DM_RIGHT_NULL, NULL, - DM_EVENT_NOSPACE, - xip, DM_RIGHT_NULL, NULL, - 0, 0, 0); /* Delay flag intentionally unused */ + + error = xfs_dmapi_event_nospace(xip); + if (need_i_mutex) mutex_lock(&inode->i_mutex); xfs_ilock(ip, iolock); Index: b/fs/xfs/linux-2.6/xfs_ioctl.c =================================================================== --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c @@ -1120,10 +1120,7 @@ xfs_ioctl_setattr( if (code) return code; - (void) xfs_dmapi_send_namesp(ip, DM_RIGHT_NULL, NULL, - DM_EVENT_ATTRIBUTE, - NULL, DM_RIGHT_NULL, NULL, - 0, 0, (mask & FSX_NONBLOCK) ? DM_FLAGS_NDELAY : 0); + xfs_dmapi_event_attribute(ip, mask & FSX_NONBLOCK); return 0; Index: b/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -1206,7 +1206,7 @@ xfs_fs_put_super( xfs_sync_attr(mp, 0); } - xfs_dmapi_send_preunmount(mp); + xfs_dmapi_event_preunmount(mp); /* * Blow away any referenced inode in the filestreams cache. @@ -1217,7 +1217,7 @@ xfs_fs_put_super( XFS_bflush(mp->m_ddev_targp); - xfs_dmapi_send_unmount(mp); + xfs_dmapi_event_unmount(mp); xfs_unmountfs(mp); xfs_freesb(mp); @@ -1612,7 +1612,7 @@ xfs_fs_fill_super( * others. If that happens, we should probably disable * DMAPI on the file system or something. */ - (void) xfs_dmapi_send_mount(mp, mtpt); + (void) xfs_dmapi_event_mount(mp, mtpt); sb->s_magic = XFS_SB_MAGIC; sb->s_blocksize = mp->m_sb.sb_blocksize; Index: b/fs/xfs/xfs_bmap.c =================================================================== --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -5620,8 +5620,7 @@ xfs_getbmap( * when in fact they may represent offline user data. */ if (!(iflags & BMV_IF_NO_DMAPI_READ)) { - error = xfs_dmapi_send_data(ip, DM_EVENT_READ, - 0, 0, 0, 0); + error = xfs_dmapi_event_read_simple(ip); if (error) return XFS_ERROR(error); } Index: b/fs/xfs/xfs_dmapi.h =================================================================== --- a/fs/xfs/xfs_dmapi.h +++ b/fs/xfs/xfs_dmapi.h @@ -148,15 +148,6 @@ typedef enum { #define DM_FLAGS_IALLOCSEM_WR 0x020 /* thread holds i_alloc_sem wr */ /* - * Macros to turn caller specified delay/block flags into - * dm_send_xxxx_event flag DM_FLAGS_NDELAY. - */ - -#define FILP_DELAY_FLAG(filp) ((filp->f_flags&(O_NDELAY|O_NONBLOCK)) ? \ - DM_FLAGS_NDELAY : 0) -#define AT_DELAY_FLAG(f) ((f & XFS_ATTR_NONBLOCK) ? DM_FLAGS_NDELAY : 0) - -/* * Prototypes and functions for the Data Migration subsystem. */ @@ -353,4 +344,254 @@ xfs_dmapi_send_unmount( } } +/* Customized event functions, based on the DMAPI interfaces */ + +/* Mount point events */ + +static inline int +xfs_dmapi_event_mount( + struct xfs_mount *mp, + char *path) +{ + return xfs_dmapi_send_mount(mp, path); +} + +static inline void +xfs_dmapi_event_preunmount( + struct xfs_mount *mp) +{ + xfs_dmapi_send_preunmount(mp); +} + +static inline void +xfs_dmapi_event_unmount( + struct xfs_mount *mp) +{ + xfs_dmapi_send_unmount(mp); +} + +/* Inode events */ + +static inline int +xfs_dmapi_event_create( + struct xfs_inode *dip, + const char *name, + mode_t mode) +{ + return xfs_dmapi_send_namesp(dip, DM_RIGHT_NULL, name, + DM_EVENT_CREATE, + NULL, DM_RIGHT_NULL, NULL, + mode, 0, 0); +} + +static inline void +xfs_dmapi_event_postcreate( + struct xfs_inode *dip, + struct xfs_inode *ip, + const char *name, + mode_t mode, + int retcode) +{ + (void) xfs_dmapi_send_namesp(dip, DM_RIGHT_NULL, name, + DM_EVENT_POSTCREATE, + ip, DM_RIGHT_NULL, NULL, + mode, retcode, 0); +} + +static inline int +xfs_dmapi_event_remove( + struct xfs_inode *dip, + const char *name, + mode_t mode) +{ + return xfs_dmapi_send_namesp(dip, DM_RIGHT_NULL, name, + DM_EVENT_REMOVE, + NULL, DM_RIGHT_NULL, NULL, + mode, 0, 0); +} + +static inline void +xfs_dmapi_event_postremove( + struct xfs_inode *dip, + const char *name, + mode_t mode, + int retcode) +{ + (void) xfs_dmapi_send_namesp(dip, DM_RIGHT_NULL, name, + DM_EVENT_POSTREMOVE, + NULL, DM_RIGHT_NULL, NULL, + mode, retcode, 0); +} + +static inline int +xfs_dmapi_event_rename( + struct xfs_inode *src_dip, + const char *src_name, + struct xfs_inode *tgt_dip, + const char *tgt_name) +{ + return xfs_dmapi_send_namesp(src_dip, DM_RIGHT_NULL, src_name, + DM_EVENT_RENAME, + tgt_dip, DM_RIGHT_NULL, tgt_name, + 0, 0, 0); +} + +static inline void +xfs_dmapi_event_postrename( + struct xfs_inode *src_dip, + const char *src_name, + struct xfs_inode *tgt_dip, + const char *tgt_name, + int retcode) +{ + (void) xfs_dmapi_send_namesp(src_dip, DM_RIGHT_NULL, src_name, + DM_EVENT_POSTRENAME, + tgt_dip, DM_RIGHT_NULL, tgt_name, + 0, retcode, 0); +} + +static inline int +xfs_dmapi_event_link( + struct xfs_inode *src_ip, + struct xfs_inode *tgt_dip, + const char *tgt_name) +{ + return xfs_dmapi_send_namesp(tgt_dip, DM_RIGHT_NULL, tgt_name, + DM_EVENT_LINK, + src_ip, DM_RIGHT_NULL, NULL, + 0, 0, 0); +} + +static inline void +xfs_dmapi_event_postlink( + struct xfs_inode *src_ip, + struct xfs_inode *tgt_dip, + const char *tgt_name, + int retcode) +{ + (void) xfs_dmapi_send_namesp(tgt_dip, DM_RIGHT_NULL, tgt_name, + DM_EVENT_POSTLINK, + src_ip, DM_RIGHT_NULL, NULL, + 0, retcode, 0); +} + +static inline int +xfs_dmapi_event_symlink( + const char *path, /* pointed-to path */ + struct xfs_inode *tgt_dip, + const char *tgt_name) +{ + return xfs_dmapi_send_namesp(tgt_dip, DM_RIGHT_NULL, tgt_name, + DM_EVENT_SYMLINK, + NULL, DM_RIGHT_NULL, path, + 0, 0, 0); +} + +static inline void +xfs_dmapi_event_postsymlink( + const char *path, /* pointed-to path */ + struct xfs_inode *tgt_dip, + struct xfs_inode *tgt_ip, /* ignored if retcode != 0 */ + const char *tgt_name, + int retcode) +{ + (void) xfs_dmapi_send_namesp(tgt_dip, DM_RIGHT_NULL, tgt_name, + DM_EVENT_POSTSYMLINK, + retcode ? NULL : tgt_ip, DM_RIGHT_NULL, path, + 0, retcode, 0); +} + +static inline int +xfs_dmapi_event_mmap( + struct vm_area_struct *vma, + unsigned long vm_flags) +{ + return xfs_dmapi_send_mmap(vma, vm_flags); +} + +static inline int +xfs_dmapi_event_read( + struct xfs_inode *ip, + xfs_off_t offset, + size_t length, + int non_blocking, + int direct_io, + int lock_flags) +{ + int dmflags = non_blocking ? DM_FLAGS_NDELAY : 0; + + if (direct_io) + dmflags |= DM_FLAGS_IMUX; + + return xfs_dmapi_send_data(ip, DM_EVENT_READ, offset, + length, dmflags, lock_flags); +} + +static inline int +xfs_dmapi_event_read_simple( + struct xfs_inode *ip) +{ + return xfs_dmapi_event_read(ip, 0, 0, 0, 0, 0); +} + +static inline int +xfs_dmapi_event_write( + struct xfs_inode *ip, + xfs_off_t offset, + size_t length, + int non_blocking, + int direct_io, + int lock_flags) +{ + int dmflags = non_blocking ? DM_FLAGS_NDELAY : 0; + + if (direct_io) + dmflags |= DM_FLAGS_IMUX; + + return xfs_dmapi_send_data(ip, DM_EVENT_WRITE, offset, + length, dmflags, lock_flags); +} + +static inline int +xfs_dmapi_event_truncate( + struct xfs_inode *ip, + xfs_off_t size, + int non_blocking) +{ + int dmflags = DM_FLAGS_IALLOCSEM_WR|DM_FLAGS_IMUX; + + if (non_blocking) + dmflags |= DM_FLAGS_NDELAY; + + return xfs_dmapi_send_data(ip, DM_EVENT_TRUNCATE, size, 0, dmflags, 0); +} + +static inline void +xfs_dmapi_event_attribute( + struct xfs_inode *ip, + int delay) +{ + (void) xfs_dmapi_send_namesp(ip, DM_RIGHT_NULL, NULL, + DM_EVENT_ATTRIBUTE, + NULL, DM_RIGHT_NULL, NULL, + 0, 0, delay ? DM_FLAGS_NDELAY : 0); +} + +static inline void +xfs_dmapi_event_destroy( + struct xfs_inode *ip) +{ + (void) xfs_dmapi_send_destroy(ip, DM_RIGHT_NULL); +} + +static inline int +xfs_dmapi_event_nospace( + struct xfs_inode *ip) +{ + return xfs_dmapi_send_namesp(ip, DM_RIGHT_NULL, NULL, + DM_EVENT_NOSPACE, + ip, DM_RIGHT_NULL, NULL, + 0, 0, 0); /* Delay flag intentionally unused */ +} + #endif /* __XFS_DMAPI_H__ */ Index: b/fs/xfs/xfs_rename.c =================================================================== --- a/fs/xfs/xfs_rename.c +++ b/fs/xfs/xfs_rename.c @@ -119,10 +119,8 @@ xfs_rename( xfs_itrace_entry(src_dp); xfs_itrace_entry(target_dp); - error = xfs_dmapi_send_namesp(src_dp, DM_RIGHT_NULL, src_name->name, - DM_EVENT_RENAME, - target_dp, DM_RIGHT_NULL, target_name->name, - 0, 0, 0); + error = xfs_dmapi_event_rename(src_dp, src_name->name, + target_dp, target_name->name); if (error) return error; @@ -371,10 +369,8 @@ xfs_rename( /* Fall through to std_return with error = 0 or errno from * xfs_trans_commit */ std_return: - (void) xfs_dmapi_send_namesp(src_dp, DM_RIGHT_NULL, src_name->name, - DM_EVENT_POSTRENAME, - target_dp, DM_RIGHT_NULL, target_name->name, - 0, error, 0); + xfs_dmapi_event_postrename(src_dp, src_name->name, + target_dp, target_name->name, error); return error; abort_return: Index: b/fs/xfs/xfs_vnodeops.c =================================================================== --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -144,11 +144,8 @@ xfs_setattr( } } else { if (!(flags & XFS_ATTR_DMI)) { - int dmflags = AT_DELAY_FLAG(flags); - - dmflags |= DM_FLAGS_IALLOCSEM_WR|DM_FLAGS_IMUX; - code = xfs_dmapi_send_data(ip, DM_EVENT_TRUNCATE, - iattr->ia_size, 0, dmflags, 0); + code = xfs_dmapi_event_truncate(ip, iattr->ia_size, + flags & XFS_ATTR_NONBLOCK); if (code) { lock_flags = 0; goto error_return; @@ -471,12 +468,8 @@ xfs_setattr( return XFS_ERROR(code); } - if (!(flags & XFS_ATTR_DMI)) { - (void) xfs_dmapi_send_namesp(ip, DM_RIGHT_NULL, NULL, - DM_EVENT_ATTRIBUTE, - NULL, DM_RIGHT_NULL, NULL, - 0, 0, AT_DELAY_FLAG(flags)); - } + if (!(flags & XFS_ATTR_DMI)) + xfs_dmapi_event_attribute(ip, flags & XFS_ATTR_NONBLOCK); return 0; abort_return: @@ -1062,7 +1055,7 @@ xfs_inactive( mp = ip->i_mount; if (ip->i_d.di_nlink == 0) - (void) xfs_dmapi_send_destroy(ip, DM_RIGHT_NULL); + xfs_dmapi_event_destroy(ip); error = 0; @@ -1315,10 +1308,7 @@ xfs_create( if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); - error = xfs_dmapi_send_namesp(dp, DM_RIGHT_NULL, name->name, - DM_EVENT_CREATE, - NULL, DM_RIGHT_NULL, NULL, - mode, 0, 0); + error = xfs_dmapi_event_create(dp, name->name, mode); if (error) return error; @@ -1488,10 +1478,7 @@ xfs_create( /* Fallthrough to std_return with error = 0 */ std_return: - (void) xfs_dmapi_send_namesp(dp, DM_RIGHT_NULL, name->name, - DM_EVENT_POSTCREATE, - ip, DM_RIGHT_NULL, NULL, - mode, error, 0); + xfs_dmapi_event_postcreate(dp, ip, name->name, mode, error); return error; @@ -1729,10 +1716,7 @@ xfs_remove( if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); - error = xfs_dmapi_send_namesp(dp, DM_RIGHT_NULL, name->name, - DM_EVENT_REMOVE, - NULL, DM_RIGHT_NULL, NULL, - ip->i_d.di_mode, 0, 0); + error = xfs_dmapi_event_remove(dp, name->name, ip->i_d.di_mode); if (error) return error; @@ -1874,10 +1858,7 @@ xfs_remove( xfs_filestream_deassociate(ip); std_return: - (void) xfs_dmapi_send_namesp(dp, DM_RIGHT_NULL, name->name, - DM_EVENT_POSTREMOVE, - NULL, DM_RIGHT_NULL, NULL, - ip->i_d.di_mode, error, 0); + xfs_dmapi_event_postremove(dp, name->name, ip->i_d.di_mode, error); return error; @@ -1912,10 +1893,7 @@ xfs_link( if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); - error = xfs_dmapi_send_namesp(tdp, DM_RIGHT_NULL, target_name->name, - DM_EVENT_LINK, - sip, DM_RIGHT_NULL, NULL, - 0, 0, 0); + error = xfs_dmapi_event_link(sip, tdp, target_name->name); if (error) return error; @@ -2013,10 +1991,7 @@ xfs_link( /* Fall through to std_return with error = 0. */ std_return: - (void) xfs_dmapi_send_namesp(tdp, DM_RIGHT_NULL, target_name->name, - DM_EVENT_POSTLINK, - sip, DM_RIGHT_NULL, NULL, - 0, error, 0); + xfs_dmapi_event_postlink(sip, tdp, target_name->name, error); return error; @@ -2078,10 +2053,8 @@ xfs_symlink( if (pathlen >= MAXPATHLEN) /* total string too long */ return XFS_ERROR(ENAMETOOLONG); - error = xfs_dmapi_send_namesp(dp, DM_RIGHT_NULL, link_name->name, - DM_EVENT_SYMLINK, - NULL, DM_RIGHT_NULL, - (unsigned char *)target_path, 0, 0, 0); + error = xfs_dmapi_event_symlink((unsigned char *) target_path, dp, + link_name->name); if (error) return error; @@ -2271,10 +2244,8 @@ xfs_symlink( /* Fall through to std_return with error = 0 or errno from * xfs_trans_commit */ std_return: - (void) xfs_dmapi_send_namesp(dp, DM_RIGHT_NULL, link_name->name, - DM_EVENT_POSTSYMLINK, - error ? NULL : ip, DM_RIGHT_NULL, - (unsigned char *) target_path, 0, error, 0); + xfs_dmapi_event_postsymlink((unsignec char *) target_path, dp, ip, + link_name->name, error); if (!error) *ipp = ip; @@ -2406,8 +2377,8 @@ xfs_alloc_file_space( end_dmi_offset = offset+len; if (end_dmi_offset > ip->i_size) end_dmi_offset = ip->i_size; - error = xfs_dmapi_send_data(ip, DM_EVENT_WRITE, offset, - end_dmi_offset - offset, 0, 0); + error = xfs_dmapi_event_write(ip, offset, + end_dmi_offset - offset, 0, 0, 0); if (error) return error; } @@ -2514,11 +2485,8 @@ retry: } dmapi_enospc_check: if (error == ENOSPC && (attr_flags & XFS_ATTR_DMI) == 0) { - error = xfs_dmapi_send_namesp(ip, DM_RIGHT_NULL, NULL, - DM_EVENT_NOSPACE, - ip, DM_RIGHT_NULL, NULL, - 0, 0, 0); /* Delay flag intentionally unused */ - if (error == 0) + error = xfs_dmapi_event_nospace(ip); + if (! error) goto retry; /* Maybe DMAPI app. has made space */ /* else fall through with error from XFS_SEND_DATA */ } @@ -2681,9 +2649,9 @@ xfs_free_file_space( if (offset < ip->i_size && (attr_flags & XFS_ATTR_DMI) == 0) { if (end_dmi_offset > ip->i_size) end_dmi_offset = ip->i_size; - error = xfs_dmapi_send_data(ip, DM_EVENT_WRITE, - offset, end_dmi_offset - offset, - AT_DELAY_FLAG(attr_flags), 0); + error = xfs_dmapi_event_write(ip, offset, + end_dmi_offset - offset, + attr_flags & XFS_ATTR_NONBLOCK, 0, 0); if (error) return error; } From aelder@sgi.com Mon Jun 28 17:03: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 relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5SM3bop044363 for ; Mon, 28 Jun 2010 17:03:37 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0863F3040A4; Mon, 28 Jun 2010 15:06:23 -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 o5SM6Mrk018222; Mon, 28 Jun 2010 17:06:22 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o5SM6M4v018220; Mon, 28 Jun 2010 17:06:22 -0500 From: Alex Elder Message-Id: <201006282206.o5SM6M4v018220@stout.americas.sgi.com> Date: Mon, 28 Jun 2010 17:06:22 -0500 To: xfs@oss.sgi.com Subject: [PATCH 12/15] xfs: make DMAPI functions non-inline 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 Now that all of the DMAPI event generation code has been converted to proper functions, move them out of the header file and make them non-inline. One exception is xfs_dmapi_event_enabled(), which would have to be added to the set of exported symbols otherwise. Signed-off-by: Alex Elder --- fs/xfs/xfs_dmapi.h | 460 +++++++---------------------------------------------- fs/xfs/xfs_dmops.c | 408 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 472 insertions(+), 396 deletions(-) Index: b/fs/xfs/xfs_dmapi.h =================================================================== --- a/fs/xfs/xfs_dmapi.h +++ b/fs/xfs/xfs_dmapi.h @@ -151,9 +151,6 @@ typedef enum { * Prototypes and functions for the Data Migration subsystem. */ -extern int xfs_dmops_get(struct xfs_mount *); -extern void xfs_dmops_put(struct xfs_mount *); - extern struct xfs_dmops xfs_dmcore_xfs; typedef int (*xfs_send_data_t)(int, struct xfs_inode *, @@ -178,8 +175,10 @@ typedef struct xfs_dmops { xfs_send_unmount_t xfs_send_unmount; } xfs_dmops_t; -#define XFS_DMAPI_UNMOUNT_FLAGS(mp) \ - (((mp)->m_dmevmask & (1 << DM_EVENT_UNMOUNT)) ? 0 : DM_FLAGS_UNWANTED) +extern int xfs_dmops_get(struct xfs_mount *); +extern void xfs_dmops_put(struct xfs_mount *); + +#ifdef XFS_DMAPI /* * DMAPI events only apply if DMAPI support was specified at mount @@ -189,409 +188,78 @@ typedef struct xfs_dmops { static inline int xfs_dmapi_event_enabled(struct xfs_inode *ip, dm_eventtype_t event) { -#ifdef XFS_DMAPI unsigned int event_mask = 1 << event; return ip->i_mount->m_dm_ops && (ip->i_mount->m_dmevmask & event_mask || ip->i_d.di_dmevmask & event_mask); -#else /* ! XFS_DMAPI */ - return 0; -#endif /* ! XFS_DMAPI */ -} - -static inline int -xfs_dmapi_send_data( - struct xfs_inode *ip, - dm_eventtype_t event, - xfs_off_t offset, - size_t length, - int flags, - int lock_flags) -{ - xfs_send_data_t send_data; - - if (! xfs_dmapi_event_enabled(ip, event)) - return 0; - send_data = ip->i_mount->m_dm_ops->xfs_send_data; - - return send_data(event, ip, offset, length, flags, lock_flags); -} - -static inline int -xfs_dmapi_send_mmap( - struct vm_area_struct *vma, - unsigned long vm_flags) -{ - struct inode *inode = vma->vm_file->f_path.dentry->d_inode; - struct xfs_mount *mp = XFS_M(inode->i_sb); - - if (mp->m_dm_ops) { - xfs_send_mmap_t send_mmap = mp->m_dm_ops->xfs_send_mmap; - - return send_mmap(vma, vm_flags); - } - ASSERT_ALWAYS(vm_flags == VM_WRITE); - - return 0; -} - -static inline int -xfs_dmapi_send_destroy( - struct xfs_inode *ip, - dm_right_t right) -{ - xfs_send_destroy_t send_destroy; - - if (!xfs_dmapi_event_enabled(ip, DM_EVENT_DESTROY)) - return 0; - send_destroy = ip->i_mount->m_dm_ops->xfs_send_destroy; - - return send_destroy(ip, right); -} - -static inline int -xfs_dmapi_send_namesp( - struct xfs_inode *ip1, - dm_right_t right1, - const char *name1, - dm_eventtype_t event, - struct xfs_inode *ip2, - dm_right_t right2, - const char *name2, - mode_t mode, - int ret, - int flags) -{ - int enabled; - xfs_send_namesp_t send_namesp; - - ASSERT(ip1 != NULL); - if (ip2 && ip1->i_mount != ip2->i_mount) - return -EINVAL; - - switch (event) { - case DM_EVENT_PREUNMOUNT: /* xfs_dmapi_send_preunmount() */ - enabled = 1; - break; - case DM_EVENT_CREATE: - case DM_EVENT_POSTCREATE: - case DM_EVENT_REMOVE: - case DM_EVENT_POSTREMOVE: - case DM_EVENT_LINK: - case DM_EVENT_POSTLINK: - case DM_EVENT_SYMLINK: - case DM_EVENT_POSTSYMLINK: - case DM_EVENT_ATTRIBUTE: - case DM_EVENT_NOSPACE: - enabled = xfs_dmapi_event_enabled(ip1, event); - break; - case DM_EVENT_RENAME: - case DM_EVENT_POSTRENAME: - enabled = xfs_dmapi_event_enabled(ip1, event) || - xfs_dmapi_event_enabled(ip2, event); - break; - default: - ASSERT(0); - enabled = 0; - break; - } - if (!enabled) - return 0; - - send_namesp = ip1->i_mount->m_dm_ops->xfs_send_namesp; - - return send_namesp(event, NULL, ip1, right1, ip2, right2, - name1, name2, mode, ret, flags); -} - -static inline int -xfs_dmapi_send_mount( - struct xfs_mount *mp, - char *path) -{ - if (mp->m_dm_ops) { - xfs_send_mount_t send_mount = mp->m_dm_ops->xfs_send_mount; - - return send_mount(mp, DM_RIGHT_NULL, path, mp->m_fsname); - } - - return ENOSYS; -} - - -static inline void -xfs_dmapi_send_preunmount( - struct xfs_mount *mp) -{ - if (mp->m_dm_ops) - (void) xfs_dmapi_send_namesp(mp->m_rootip, DM_RIGHT_NULL, NULL, - DM_EVENT_PREUNMOUNT, - mp->m_rootip, DM_RIGHT_NULL, NULL, - 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); -} - -static inline void -xfs_dmapi_send_unmount( - struct xfs_mount *mp) -{ - if (mp->m_dm_ops) { - xfs_send_unmount_t send_unmount = - mp->m_dm_ops->xfs_send_unmount; - - send_unmount(mp, mp->m_rootip, DM_RIGHT_NULL, - 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); - } } /* Customized event functions, based on the DMAPI interfaces */ -/* Mount point events */ - -static inline int -xfs_dmapi_event_mount( - struct xfs_mount *mp, - char *path) -{ - return xfs_dmapi_send_mount(mp, path); -} - -static inline void -xfs_dmapi_event_preunmount( - struct xfs_mount *mp) -{ - xfs_dmapi_send_preunmount(mp); -} - -static inline void -xfs_dmapi_event_unmount( - struct xfs_mount *mp) -{ - xfs_dmapi_send_unmount(mp); -} - -/* Inode events */ - -static inline int -xfs_dmapi_event_create( - struct xfs_inode *dip, - const char *name, - mode_t mode) -{ - return xfs_dmapi_send_namesp(dip, DM_RIGHT_NULL, name, - DM_EVENT_CREATE, - NULL, DM_RIGHT_NULL, NULL, - mode, 0, 0); -} - -static inline void -xfs_dmapi_event_postcreate( - struct xfs_inode *dip, - struct xfs_inode *ip, - const char *name, - mode_t mode, - int retcode) -{ - (void) xfs_dmapi_send_namesp(dip, DM_RIGHT_NULL, name, - DM_EVENT_POSTCREATE, - ip, DM_RIGHT_NULL, NULL, - mode, retcode, 0); -} - -static inline int -xfs_dmapi_event_remove( - struct xfs_inode *dip, - const char *name, - mode_t mode) -{ - return xfs_dmapi_send_namesp(dip, DM_RIGHT_NULL, name, - DM_EVENT_REMOVE, - NULL, DM_RIGHT_NULL, NULL, - mode, 0, 0); -} - -static inline void -xfs_dmapi_event_postremove( - struct xfs_inode *dip, - const char *name, - mode_t mode, - int retcode) -{ - (void) xfs_dmapi_send_namesp(dip, DM_RIGHT_NULL, name, - DM_EVENT_POSTREMOVE, - NULL, DM_RIGHT_NULL, NULL, - mode, retcode, 0); -} +extern int xfs_dmapi_event_mount(struct xfs_mount *, char *); +extern void xfs_dmapi_event_preunmount(struct xfs_mount *); +extern void xfs_dmapi_event_unmount(struct xfs_mount *); + +extern int xfs_dmapi_event_create(struct xfs_inode *, const char *, + mode_t mode); +extern void xfs_dmapi_event_postcreate(struct xfs_inode *, + struct xfs_inode *, const char *, mode_t, int); +extern int xfs_dmapi_event_remove(struct xfs_inode *, const char *, + mode_t); +extern void xfs_dmapi_event_postremove(struct xfs_inode *, + const char *, mode_t, int); +extern int xfs_dmapi_event_rename(struct xfs_inode *, const char *, + struct xfs_inode *, const char *); +extern void xfs_dmapi_event_postrename(struct xfs_inode *, const + char *, struct xfs_inode *, const char *, int); +extern int xfs_dmapi_event_link(struct xfs_inode *, struct xfs_inode *, + const char *); +extern void xfs_dmapi_event_postlink(struct xfs_inode *, struct xfs_inode *, + const char *, int); +extern int xfs_dmapi_event_symlink(const char *, struct xfs_inode *, + const char *); +extern void xfs_dmapi_event_postsymlink(const char *, struct xfs_inode *, + struct xfs_inode *, const char *, int); +extern int xfs_dmapi_event_mmap(struct vm_area_struct *, unsigned long); +extern int xfs_dmapi_event_read(struct xfs_inode *, xfs_off_t, size_t, + int, int, int); +extern int xfs_dmapi_event_read_simple(struct xfs_inode *); +extern int xfs_dmapi_event_write(struct xfs_inode *, xfs_off_t, size_t, + int, int, int); +extern int xfs_dmapi_event_truncate(struct xfs_inode *, xfs_off_t, int); +extern void xfs_dmapi_event_attribute(struct xfs_inode *, int); +extern void xfs_dmapi_event_destroy(struct xfs_inode *); +extern int xfs_dmapi_event_nospace(struct xfs_inode *); -static inline int -xfs_dmapi_event_rename( - struct xfs_inode *src_dip, - const char *src_name, - struct xfs_inode *tgt_dip, - const char *tgt_name) -{ - return xfs_dmapi_send_namesp(src_dip, DM_RIGHT_NULL, src_name, - DM_EVENT_RENAME, - tgt_dip, DM_RIGHT_NULL, tgt_name, - 0, 0, 0); -} - -static inline void -xfs_dmapi_event_postrename( - struct xfs_inode *src_dip, - const char *src_name, - struct xfs_inode *tgt_dip, - const char *tgt_name, - int retcode) -{ - (void) xfs_dmapi_send_namesp(src_dip, DM_RIGHT_NULL, src_name, - DM_EVENT_POSTRENAME, - tgt_dip, DM_RIGHT_NULL, tgt_name, - 0, retcode, 0); -} - -static inline int -xfs_dmapi_event_link( - struct xfs_inode *src_ip, - struct xfs_inode *tgt_dip, - const char *tgt_name) -{ - return xfs_dmapi_send_namesp(tgt_dip, DM_RIGHT_NULL, tgt_name, - DM_EVENT_LINK, - src_ip, DM_RIGHT_NULL, NULL, - 0, 0, 0); -} - -static inline void -xfs_dmapi_event_postlink( - struct xfs_inode *src_ip, - struct xfs_inode *tgt_dip, - const char *tgt_name, - int retcode) -{ - (void) xfs_dmapi_send_namesp(tgt_dip, DM_RIGHT_NULL, tgt_name, - DM_EVENT_POSTLINK, - src_ip, DM_RIGHT_NULL, NULL, - 0, retcode, 0); -} - -static inline int -xfs_dmapi_event_symlink( - const char *path, /* pointed-to path */ - struct xfs_inode *tgt_dip, - const char *tgt_name) -{ - return xfs_dmapi_send_namesp(tgt_dip, DM_RIGHT_NULL, tgt_name, - DM_EVENT_SYMLINK, - NULL, DM_RIGHT_NULL, path, - 0, 0, 0); -} - -static inline void -xfs_dmapi_event_postsymlink( - const char *path, /* pointed-to path */ - struct xfs_inode *tgt_dip, - struct xfs_inode *tgt_ip, /* ignored if retcode != 0 */ - const char *tgt_name, - int retcode) -{ - (void) xfs_dmapi_send_namesp(tgt_dip, DM_RIGHT_NULL, tgt_name, - DM_EVENT_POSTSYMLINK, - retcode ? NULL : tgt_ip, DM_RIGHT_NULL, path, - 0, retcode, 0); -} - -static inline int -xfs_dmapi_event_mmap( - struct vm_area_struct *vma, - unsigned long vm_flags) -{ - return xfs_dmapi_send_mmap(vma, vm_flags); -} - -static inline int -xfs_dmapi_event_read( - struct xfs_inode *ip, - xfs_off_t offset, - size_t length, - int non_blocking, - int direct_io, - int lock_flags) -{ - int dmflags = non_blocking ? DM_FLAGS_NDELAY : 0; - - if (direct_io) - dmflags |= DM_FLAGS_IMUX; - - return xfs_dmapi_send_data(ip, DM_EVENT_READ, offset, - length, dmflags, lock_flags); -} - -static inline int -xfs_dmapi_event_read_simple( - struct xfs_inode *ip) -{ - return xfs_dmapi_event_read(ip, 0, 0, 0, 0, 0); -} - -static inline int -xfs_dmapi_event_write( - struct xfs_inode *ip, - xfs_off_t offset, - size_t length, - int non_blocking, - int direct_io, - int lock_flags) -{ - int dmflags = non_blocking ? DM_FLAGS_NDELAY : 0; - - if (direct_io) - dmflags |= DM_FLAGS_IMUX; - - return xfs_dmapi_send_data(ip, DM_EVENT_WRITE, offset, - length, dmflags, lock_flags); -} - -static inline int -xfs_dmapi_event_truncate( - struct xfs_inode *ip, - xfs_off_t size, - int non_blocking) -{ - int dmflags = DM_FLAGS_IALLOCSEM_WR|DM_FLAGS_IMUX; - - if (non_blocking) - dmflags |= DM_FLAGS_NDELAY; - - return xfs_dmapi_send_data(ip, DM_EVENT_TRUNCATE, size, 0, dmflags, 0); -} +#else /* ! XFS_DMAPI */ -static inline void -xfs_dmapi_event_attribute( - struct xfs_inode *ip, - int delay) -{ - (void) xfs_dmapi_send_namesp(ip, DM_RIGHT_NULL, NULL, - DM_EVENT_ATTRIBUTE, - NULL, DM_RIGHT_NULL, NULL, - 0, 0, delay ? DM_FLAGS_NDELAY : 0); -} +#define xfs_dmapi_event_enabled(i, e) 0 -static inline void -xfs_dmapi_event_destroy( - struct xfs_inode *ip) -{ - (void) xfs_dmapi_send_destroy(ip, DM_RIGHT_NULL); -} +#define xfs_dmapi_event_mount(mp, path) 0 +#define xfs_dmapi_event_preunmount(mp) (void) 0 +#define xfs_dmapi_event_unmount(mp) (void) 0 + +#define xfs_dmapi_event_create(i, n, mode) 0 +#define xfs_dmapi_event_postcreate(dip, ip, n, mode, ret) (void) 0 +#define xfs_dmapi_event_remove(dip, n, mode) 0 +#define xfs_dmapi_event_postremove(dip, n, mode, ret) (void) 0 +#define xfs_dmapi_event_rename(sdip, sn, tdip, tn) 0 +#define xfs_dmapi_event_postrename(sdip, sn, tdip, tn, ret) (void) 0 +#define xfs_dmapi_event_link(sip, tdip, tn) 0 +#define xfs_dmapi_event_postlink(sip, tdip, tn, ret) (void) 0 +#define xfs_dmapi_event_symlink(path, tdip, tn) 0 +#define xfs_dmapi_event_postsymlink(path, tdip, tip, tn, ret) (void) 0 +#define xfs_dmapi_event_mmap(vma, vm_flags) 0 +#define xfs_dmapi_event_read(ip, offset, length, nb, d, lfl) 0 +#define xfs_dmapi_event_read_simple(ip) 0 +#define xfs_dmapi_event_write(ip, offset, length, nb, d, lfl) 0 +#define xfs_dmapi_event_truncate(ip, size, nb) 0 +#define xfs_dmapi_event_attribute(ip, delay) (void) 0 +#define xfs_dmapi_event_destroy(ip) (void) 0 +#define xfs_dmapi_event_nospace(ip) 0 -static inline int -xfs_dmapi_event_nospace( - struct xfs_inode *ip) -{ - return xfs_dmapi_send_namesp(ip, DM_RIGHT_NULL, NULL, - DM_EVENT_NOSPACE, - ip, DM_RIGHT_NULL, NULL, - 0, 0, 0); /* Delay flag intentionally unused */ -} +#endif /* ! XFS_DMAPI */ #endif /* __XFS_DMAPI_H__ */ + Index: b/fs/xfs/xfs_dmops.c =================================================================== --- a/fs/xfs/xfs_dmops.c +++ b/fs/xfs/xfs_dmops.c @@ -55,8 +55,416 @@ xfs_dmops_get(struct xfs_mount *mp) void xfs_dmops_put(struct xfs_mount *mp) { +#ifdef XFS_DMAPI if (mp->m_dm_ops) { symbol_put(xfs_dmcore_xfs); mp->m_dm_ops = NULL; } +#endif /* XFS_DMAPI */ + ASSERT(!mp->m_dm_ops); } + +#ifdef XFS_DMAPI + +/* Private functions that encapsulate conditionally sending DMAPI messages */ + +static inline int +xfs_dmapi_send_data( + struct xfs_inode *ip, + dm_eventtype_t event, + xfs_off_t offset, + size_t length, + int flags, + int lock_flags) +{ + xfs_send_data_t send_data; + + if (! xfs_dmapi_event_enabled(ip, event)) + return 0; + send_data = ip->i_mount->m_dm_ops->xfs_send_data; + + return send_data(event, ip, offset, length, flags, lock_flags); +} + +static inline int +xfs_dmapi_send_mmap( + struct vm_area_struct *vma, + unsigned long vm_flags) +{ + struct inode *inode = vma->vm_file->f_path.dentry->d_inode; + struct xfs_mount *mp = XFS_M(inode->i_sb); + + if (mp->m_dm_ops) { + xfs_send_mmap_t send_mmap = mp->m_dm_ops->xfs_send_mmap; + + return send_mmap(vma, vm_flags); + } + ASSERT_ALWAYS(vm_flags == VM_WRITE); + + return 0; +} + +static inline int +xfs_dmapi_send_destroy( + struct xfs_inode *ip, + dm_right_t right) +{ + xfs_send_destroy_t send_destroy; + + if (!xfs_dmapi_event_enabled(ip, DM_EVENT_DESTROY)) + return 0; + send_destroy = ip->i_mount->m_dm_ops->xfs_send_destroy; + + return send_destroy(ip, right); +} + +static inline int +xfs_dmapi_send_namesp( + struct xfs_inode *ip1, + dm_right_t right1, + const char *name1, + dm_eventtype_t event, + struct xfs_inode *ip2, + dm_right_t right2, + const char *name2, + mode_t mode, + int ret, + int flags) +{ + int enabled; + xfs_send_namesp_t send_namesp; + + ASSERT(ip1 != NULL); + if (ip2 && ip1->i_mount != ip2->i_mount) + return -EINVAL; + + switch (event) { + case DM_EVENT_PREUNMOUNT: /* xfs_dmapi_send_preunmount() */ + enabled = 1; + break; + case DM_EVENT_CREATE: + case DM_EVENT_POSTCREATE: + case DM_EVENT_REMOVE: + case DM_EVENT_POSTREMOVE: + case DM_EVENT_LINK: + case DM_EVENT_POSTLINK: + case DM_EVENT_SYMLINK: + case DM_EVENT_POSTSYMLINK: + case DM_EVENT_ATTRIBUTE: + case DM_EVENT_NOSPACE: + enabled = xfs_dmapi_event_enabled(ip1, event); + break; + case DM_EVENT_RENAME: + case DM_EVENT_POSTRENAME: + enabled = xfs_dmapi_event_enabled(ip1, event) || + xfs_dmapi_event_enabled(ip2, event); + break; + default: + ASSERT(0); + enabled = 0; + break; + } + if (!enabled) + return 0; + + send_namesp = ip1->i_mount->m_dm_ops->xfs_send_namesp; + + return send_namesp(event, NULL, ip1, right1, ip2, right2, + name1, name2, mode, ret, flags); +} + +static inline int +xfs_dmapi_send_mount( + struct xfs_mount *mp, + char *path) +{ + if (mp->m_dm_ops) { + xfs_send_mount_t send_mount = mp->m_dm_ops->xfs_send_mount; + + return send_mount(mp, DM_RIGHT_NULL, path, mp->m_fsname); + } + + return ENOSYS; +} + +#define XFS_DMAPI_UNMOUNT_FLAGS(mp) \ + (((mp)->m_dmevmask & (1 << DM_EVENT_UNMOUNT)) ? 0 : DM_FLAGS_UNWANTED) + +static inline void +xfs_dmapi_send_preunmount( + struct xfs_mount *mp) +{ + if (mp->m_dm_ops) + (void) xfs_dmapi_send_namesp(mp->m_rootip, DM_RIGHT_NULL, NULL, + DM_EVENT_PREUNMOUNT, + mp->m_rootip, DM_RIGHT_NULL, NULL, + 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); +} + +static inline void +xfs_dmapi_send_unmount( + struct xfs_mount *mp) +{ + if (mp->m_dm_ops) { + xfs_send_unmount_t send_unmount = + mp->m_dm_ops->xfs_send_unmount; + + send_unmount(mp, mp->m_rootip, DM_RIGHT_NULL, + 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); + } +} + +/* + * Exported event functions, which translate file system events into + * the DMAPI messages they should send. + */ + +/* Mount point events */ + +int +xfs_dmapi_event_mount( + struct xfs_mount *mp, + char *path) +{ + return xfs_dmapi_send_mount(mp, path); +} + +void +xfs_dmapi_event_preunmount( + struct xfs_mount *mp) +{ + xfs_dmapi_send_preunmount(mp); +} + +void +xfs_dmapi_event_unmount( + struct xfs_mount *mp) +{ + xfs_dmapi_send_unmount(mp); +} + +/* Inode events */ + +int +xfs_dmapi_event_create( + struct xfs_inode *dip, + const char *name, + mode_t mode) +{ + return xfs_dmapi_send_namesp(dip, DM_RIGHT_NULL, name, + DM_EVENT_CREATE, + NULL, DM_RIGHT_NULL, NULL, + mode, 0, 0); +} + +void +xfs_dmapi_event_postcreate( + struct xfs_inode *dip, + struct xfs_inode *ip, + const char *name, + mode_t mode, + int retcode) +{ + (void) xfs_dmapi_send_namesp(dip, DM_RIGHT_NULL, name, + DM_EVENT_POSTCREATE, + ip, DM_RIGHT_NULL, NULL, + mode, retcode, 0); +} + +int +xfs_dmapi_event_remove( + struct xfs_inode *dip, + const char *name, + mode_t mode) +{ + return xfs_dmapi_send_namesp(dip, DM_RIGHT_NULL, name, + DM_EVENT_REMOVE, + NULL, DM_RIGHT_NULL, NULL, + mode, 0, 0); +} + +void +xfs_dmapi_event_postremove( + struct xfs_inode *dip, + const char *name, + mode_t mode, + int retcode) +{ + (void) xfs_dmapi_send_namesp(dip, DM_RIGHT_NULL, name, + DM_EVENT_POSTREMOVE, + NULL, DM_RIGHT_NULL, NULL, + mode, retcode, 0); +} + +int +xfs_dmapi_event_rename( + struct xfs_inode *src_dip, + const char *src_name, + struct xfs_inode *tgt_dip, + const char *tgt_name) +{ + return xfs_dmapi_send_namesp(src_dip, DM_RIGHT_NULL, src_name, + DM_EVENT_RENAME, + tgt_dip, DM_RIGHT_NULL, tgt_name, + 0, 0, 0); +} + +void +xfs_dmapi_event_postrename( + struct xfs_inode *src_dip, + const char *src_name, + struct xfs_inode *tgt_dip, + const char *tgt_name, + int retcode) +{ + (void) xfs_dmapi_send_namesp(src_dip, DM_RIGHT_NULL, src_name, + DM_EVENT_POSTRENAME, + tgt_dip, DM_RIGHT_NULL, tgt_name, + 0, retcode, 0); +} + +int +xfs_dmapi_event_link( + struct xfs_inode *src_ip, + struct xfs_inode *tgt_dip, + const char *tgt_name) +{ + return xfs_dmapi_send_namesp(tgt_dip, DM_RIGHT_NULL, tgt_name, + DM_EVENT_LINK, + src_ip, DM_RIGHT_NULL, NULL, + 0, 0, 0); +} + +void +xfs_dmapi_event_postlink( + struct xfs_inode *src_ip, + struct xfs_inode *tgt_dip, + const char *tgt_name, + int retcode) +{ + (void) xfs_dmapi_send_namesp(tgt_dip, DM_RIGHT_NULL, tgt_name, + DM_EVENT_POSTLINK, + src_ip, DM_RIGHT_NULL, NULL, + 0, retcode, 0); +} + +int +xfs_dmapi_event_symlink( + const char *path, /* pointed-to path */ + struct xfs_inode *tgt_dip, + const char *tgt_name) +{ + return xfs_dmapi_send_namesp(tgt_dip, DM_RIGHT_NULL, tgt_name, + DM_EVENT_SYMLINK, + NULL, DM_RIGHT_NULL, path, + 0, 0, 0); +} + +void +xfs_dmapi_event_postsymlink( + const char *path, /* pointed-to path */ + struct xfs_inode *tgt_dip, + struct xfs_inode *tgt_ip, /* ignored if retcode != 0 */ + const char *tgt_name, + int retcode) +{ + (void) xfs_dmapi_send_namesp(tgt_dip, DM_RIGHT_NULL, tgt_name, + DM_EVENT_POSTSYMLINK, + retcode ? NULL : tgt_ip, DM_RIGHT_NULL, path, + 0, retcode, 0); +} + +int +xfs_dmapi_event_mmap( + struct vm_area_struct *vma, + unsigned long vm_flags) +{ + return xfs_dmapi_send_mmap(vma, vm_flags); +} + +int +xfs_dmapi_event_read( + struct xfs_inode *ip, + xfs_off_t offset, + size_t length, + int non_blocking, + int direct_io, + int lock_flags) +{ + int dmflags = non_blocking ? DM_FLAGS_NDELAY : 0; + + if (direct_io) + dmflags |= DM_FLAGS_IMUX; + + return xfs_dmapi_send_data(ip, DM_EVENT_READ, offset, + length, dmflags, lock_flags); +} + +int +xfs_dmapi_event_read_simple( + struct xfs_inode *ip) +{ + return xfs_dmapi_event_read(ip, 0, 0, 0, 0, 0); +} + +int +xfs_dmapi_event_write( + struct xfs_inode *ip, + xfs_off_t offset, + size_t length, + int non_blocking, + int direct_io, + int lock_flags) +{ + int dmflags = non_blocking ? DM_FLAGS_NDELAY : 0; + + if (direct_io) + dmflags |= DM_FLAGS_IMUX; + + return xfs_dmapi_send_data(ip, DM_EVENT_WRITE, offset, + length, dmflags, lock_flags); +} + +int +xfs_dmapi_event_truncate( + struct xfs_inode *ip, + xfs_off_t size, + int non_blocking) +{ + int dmflags = DM_FLAGS_IALLOCSEM_WR|DM_FLAGS_IMUX; + + if (non_blocking) + dmflags |= DM_FLAGS_NDELAY; + + return xfs_dmapi_send_data(ip, DM_EVENT_TRUNCATE, size, 0, dmflags, 0); +} + +void +xfs_dmapi_event_attribute( + struct xfs_inode *ip, + int delay) +{ + (void) xfs_dmapi_send_namesp(ip, DM_RIGHT_NULL, NULL, + DM_EVENT_ATTRIBUTE, + NULL, DM_RIGHT_NULL, NULL, + 0, 0, delay ? DM_FLAGS_NDELAY : 0); +} + +void +xfs_dmapi_event_destroy( + struct xfs_inode *ip) +{ + (void) xfs_dmapi_send_destroy(ip, DM_RIGHT_NULL); +} + +int +xfs_dmapi_event_nospace( + struct xfs_inode *ip) +{ + return xfs_dmapi_send_namesp(ip, DM_RIGHT_NULL, NULL, + DM_EVENT_NOSPACE, + ip, DM_RIGHT_NULL, NULL, + 0, 0, 0); /* Delay flag intentionally unused */ +} + +#endif /* XFS_DMAPI */ From aelder@sgi.com Mon Jun 28 17:03: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 relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5SM3lYI044384 for ; Mon, 28 Jun 2010 17:03:47 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0A49E3040A4; Mon, 28 Jun 2010 15:06:33 -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 o5SM6WYC018230; Mon, 28 Jun 2010 17:06:32 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o5SM6WJ7018228; Mon, 28 Jun 2010 17:06:32 -0500 From: Alex Elder Message-Id: <201006282206.o5SM6WJ7018228@stout.americas.sgi.com> Date: Mon, 28 Jun 2010 17:06:32 -0500 To: xfs@oss.sgi.com Subject: [PATCH 13/15] xfs: make m_dm_ops a void pointer 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 only remaining reference to the xfs_dmops data type is in the xfs_mount structure. Change that pointer into a void pointer, thereby making it possible to hide the remaining DMAPI type definitions inside the CONFIG_XFS_DMAPI conditional. Signed-off-by: Alex Elder --- fs/xfs/Makefile | 3 +++ fs/xfs/xfs_dmapi.h | 10 +++++----- fs/xfs/xfs_dmops.c | 14 ++++++++------ fs/xfs/xfs_mount.h | 2 +- 4 files changed, 17 insertions(+), 12 deletions(-) Index: b/fs/xfs/Makefile =================================================================== --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -23,6 +23,9 @@ XFS_LINUX := linux-2.6 ifeq ($(CONFIG_XFS_DEBUG),y) EXTRA_CFLAGS += -g endif +ifdef CONFIG_XFS_DMAPI + EXTRA_CFLAGS += -I$(srctree)/fs/dmapi +endif obj-$(CONFIG_XFS_FS) += xfs.o Index: b/fs/xfs/xfs_dmapi.h =================================================================== --- a/fs/xfs/xfs_dmapi.h +++ b/fs/xfs/xfs_dmapi.h @@ -151,6 +151,11 @@ typedef enum { * Prototypes and functions for the Data Migration subsystem. */ +extern int xfs_dmops_get(struct xfs_mount *); +extern void xfs_dmops_put(struct xfs_mount *); + +#ifdef XFS_DMAPI + extern struct xfs_dmops xfs_dmcore_xfs; typedef int (*xfs_send_data_t)(int, struct xfs_inode *, @@ -175,11 +180,6 @@ typedef struct xfs_dmops { xfs_send_unmount_t xfs_send_unmount; } xfs_dmops_t; -extern int xfs_dmops_get(struct xfs_mount *); -extern void xfs_dmops_put(struct xfs_mount *); - -#ifdef XFS_DMAPI - /* * DMAPI events only apply if DMAPI support was specified at mount * time. If active, a particular DMAPI event can be enabled for Index: b/fs/xfs/xfs_dmops.c =================================================================== --- a/fs/xfs/xfs_dmops.c +++ b/fs/xfs/xfs_dmops.c @@ -66,6 +66,8 @@ xfs_dmops_put(struct xfs_mount *mp) #ifdef XFS_DMAPI +#define DM_OPS(mp) ((struct xfs_dmops *) (mp)->m_dm_ops) + /* Private functions that encapsulate conditionally sending DMAPI messages */ static inline int @@ -81,7 +83,7 @@ xfs_dmapi_send_data( if (! xfs_dmapi_event_enabled(ip, event)) return 0; - send_data = ip->i_mount->m_dm_ops->xfs_send_data; + send_data = DM_OPS(ip->i_mount)->xfs_send_data; return send_data(event, ip, offset, length, flags, lock_flags); } @@ -95,7 +97,7 @@ xfs_dmapi_send_mmap( struct xfs_mount *mp = XFS_M(inode->i_sb); if (mp->m_dm_ops) { - xfs_send_mmap_t send_mmap = mp->m_dm_ops->xfs_send_mmap; + xfs_send_mmap_t send_mmap = DM_OPS(mp)->xfs_send_mmap; return send_mmap(vma, vm_flags); } @@ -113,7 +115,7 @@ xfs_dmapi_send_destroy( if (!xfs_dmapi_event_enabled(ip, DM_EVENT_DESTROY)) return 0; - send_destroy = ip->i_mount->m_dm_ops->xfs_send_destroy; + send_destroy = DM_OPS(ip->i_mount)->xfs_send_destroy; return send_destroy(ip, right); } @@ -167,7 +169,7 @@ xfs_dmapi_send_namesp( if (!enabled) return 0; - send_namesp = ip1->i_mount->m_dm_ops->xfs_send_namesp; + send_namesp = DM_OPS(ip1->i_mount)->xfs_send_namesp; return send_namesp(event, NULL, ip1, right1, ip2, right2, name1, name2, mode, ret, flags); @@ -179,7 +181,7 @@ xfs_dmapi_send_mount( char *path) { if (mp->m_dm_ops) { - xfs_send_mount_t send_mount = mp->m_dm_ops->xfs_send_mount; + xfs_send_mount_t send_mount = DM_OPS(mp)->xfs_send_mount; return send_mount(mp, DM_RIGHT_NULL, path, mp->m_fsname); } @@ -207,7 +209,7 @@ xfs_dmapi_send_unmount( { if (mp->m_dm_ops) { xfs_send_unmount_t send_unmount = - mp->m_dm_ops->xfs_send_unmount; + DM_OPS(mp)->xfs_send_unmount; send_unmount(mp, mp->m_rootip, DM_RIGHT_NULL, 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); Index: b/fs/xfs/xfs_mount.h =================================================================== --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -182,7 +182,7 @@ typedef struct xfs_mount { uint m_chsize; /* size of next field */ struct xfs_chash *m_chash; /* fs private inode per-cluster * hash table */ - struct xfs_dmops *m_dm_ops; /* vector of DMI ops */ + void *m_dm_ops; /* vector of DMI ops */ struct xfs_qmops *m_qm_ops; /* vector of XQM ops */ atomic_t m_active_trans; /* number trans frozen */ #ifdef HAVE_PERCPU_SB From aelder@sgi.com Mon Jun 28 17:03:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from 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 o5SM3vh4044405 for ; Mon, 28 Jun 2010 17:03:58 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay3.corp.sgi.com (Postfix) with ESMTP id 61345AC044; Mon, 28 Jun 2010 15:06:43 -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 o5SM6grE018240; Mon, 28 Jun 2010 17:06:42 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o5SM6g8H018238; Mon, 28 Jun 2010 17:06:42 -0500 From: Alex Elder Message-Id: <201006282206.o5SM6g8H018238@stout.americas.sgi.com> Date: Mon, 28 Jun 2010 17:06:42 -0500 To: xfs@oss.sgi.com Subject: [PATCH 14/15] xfs: kill redundant DMAPI definitions User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean A whole bunch of definitions in "xfs_dmapi.h" are never used inside XFS proper. They can be moved into the (out-of-tree) DMAPI support code where they're actually used. This includes the the DMAPI right and event types, as well as the standard DM_FLAGS_* values, which can now be taken from a standard DMAPI header in the (out-of-tree) XFS portion of the DMAPI implementatino. Signed-off-by: Alex Elder --- fs/xfs/xfs_dmapi.h | 140 +++-------------------------------------------------- 1 file changed, 8 insertions(+), 132 deletions(-) Index: b/fs/xfs/xfs_dmapi.h =================================================================== --- a/fs/xfs/xfs_dmapi.h +++ b/fs/xfs/xfs_dmapi.h @@ -18,135 +18,6 @@ #ifndef __XFS_DMAPI_H__ #define __XFS_DMAPI_H__ -#undef XFS_DMAPI -#if defined(CONFIG_XFS_DMAPI) || defined(CONFIG_XFS_DMAPI_MODULE) -#define XFS_DMAPI -#endif - -/* Values used to define the on-disk version of dm_attrname_t. All - * on-disk attribute names start with the 8-byte string "SGI_DMI_". - * - * In the on-disk inode, DMAPI attribute names consist of the user-provided - * name with the DMATTR_PREFIXSTRING pre-pended. This string must NEVER be - * changed. - */ - -#define DMATTR_PREFIXLEN 8 -#define DMATTR_PREFIXSTRING "SGI_DMI_" - -typedef enum { - DM_EVENT_INVALID = -1, - DM_EVENT_CANCEL = 0, /* not supported */ - DM_EVENT_MOUNT = 1, - DM_EVENT_PREUNMOUNT = 2, - DM_EVENT_UNMOUNT = 3, - DM_EVENT_DEBUT = 4, /* not supported */ - DM_EVENT_CREATE = 5, - DM_EVENT_CLOSE = 6, /* not supported */ - DM_EVENT_POSTCREATE = 7, - DM_EVENT_REMOVE = 8, - DM_EVENT_POSTREMOVE = 9, - DM_EVENT_RENAME = 10, - DM_EVENT_POSTRENAME = 11, - DM_EVENT_LINK = 12, - DM_EVENT_POSTLINK = 13, - DM_EVENT_SYMLINK = 14, - DM_EVENT_POSTSYMLINK = 15, - DM_EVENT_READ = 16, - DM_EVENT_WRITE = 17, - DM_EVENT_TRUNCATE = 18, - DM_EVENT_ATTRIBUTE = 19, - DM_EVENT_DESTROY = 20, - DM_EVENT_NOSPACE = 21, - DM_EVENT_USER = 22, - DM_EVENT_MAX = 23 -} dm_eventtype_t; -#define HAVE_DM_EVENTTYPE_T - -typedef enum { - DM_RIGHT_NULL, - DM_RIGHT_SHARED, - DM_RIGHT_EXCL -} dm_right_t; -#define HAVE_DM_RIGHT_T - -#define DM_XFS_VALID_FS_EVENTS ( \ - (1 << DM_EVENT_PREUNMOUNT) | \ - (1 << DM_EVENT_UNMOUNT) | \ - (1 << DM_EVENT_NOSPACE) | \ - (1 << DM_EVENT_DEBUT) | \ - (1 << DM_EVENT_CREATE) | \ - (1 << DM_EVENT_POSTCREATE) | \ - (1 << DM_EVENT_REMOVE) | \ - (1 << DM_EVENT_POSTREMOVE) | \ - (1 << DM_EVENT_RENAME) | \ - (1 << DM_EVENT_POSTRENAME) | \ - (1 << DM_EVENT_LINK) | \ - (1 << DM_EVENT_POSTLINK) | \ - (1 << DM_EVENT_SYMLINK) | \ - (1 << DM_EVENT_POSTSYMLINK) | \ - (1 << DM_EVENT_ATTRIBUTE) | \ - (1 << DM_EVENT_DESTROY) ) - -/* Events valid in dm_set_eventlist() when called with a file handle for - a regular file or a symlink. These events are persistent. -*/ - -#define DM_XFS_VALID_FILE_EVENTS ( \ - (1 << DM_EVENT_ATTRIBUTE) | \ - (1 << DM_EVENT_DESTROY) ) - -/* Events valid in dm_set_eventlist() when called with a file handle for - a directory. These events are persistent. -*/ - -#define DM_XFS_VALID_DIRECTORY_EVENTS ( \ - (1 << DM_EVENT_CREATE) | \ - (1 << DM_EVENT_POSTCREATE) | \ - (1 << DM_EVENT_REMOVE) | \ - (1 << DM_EVENT_POSTREMOVE) | \ - (1 << DM_EVENT_RENAME) | \ - (1 << DM_EVENT_POSTRENAME) | \ - (1 << DM_EVENT_LINK) | \ - (1 << DM_EVENT_POSTLINK) | \ - (1 << DM_EVENT_SYMLINK) | \ - (1 << DM_EVENT_POSTSYMLINK) | \ - (1 << DM_EVENT_ATTRIBUTE) | \ - (1 << DM_EVENT_DESTROY) ) - -/* Events supported by the XFS filesystem. */ -#define DM_XFS_SUPPORTED_EVENTS ( \ - (1 << DM_EVENT_MOUNT) | \ - (1 << DM_EVENT_PREUNMOUNT) | \ - (1 << DM_EVENT_UNMOUNT) | \ - (1 << DM_EVENT_NOSPACE) | \ - (1 << DM_EVENT_CREATE) | \ - (1 << DM_EVENT_POSTCREATE) | \ - (1 << DM_EVENT_REMOVE) | \ - (1 << DM_EVENT_POSTREMOVE) | \ - (1 << DM_EVENT_RENAME) | \ - (1 << DM_EVENT_POSTRENAME) | \ - (1 << DM_EVENT_LINK) | \ - (1 << DM_EVENT_POSTLINK) | \ - (1 << DM_EVENT_SYMLINK) | \ - (1 << DM_EVENT_POSTSYMLINK) | \ - (1 << DM_EVENT_READ) | \ - (1 << DM_EVENT_WRITE) | \ - (1 << DM_EVENT_TRUNCATE) | \ - (1 << DM_EVENT_ATTRIBUTE) | \ - (1 << DM_EVENT_DESTROY) ) - - -/* - * Definitions used for the flags field on dm_send_*_event(). - */ - -#define DM_FLAGS_NDELAY 0x001 /* return EAGAIN after dm_pending() */ -#define DM_FLAGS_UNWANTED 0x002 /* event not in fsys dm_eventset_t */ -#define DM_FLAGS_IMUX 0x004 /* thread holds i_mutex */ -#define DM_FLAGS_IALLOCSEM_RD 0x010 /* thread holds i_alloc_sem rd */ -#define DM_FLAGS_IALLOCSEM_WR 0x020 /* thread holds i_alloc_sem wr */ - /* * Prototypes and functions for the Data Migration subsystem. */ @@ -154,7 +25,12 @@ typedef enum { extern int xfs_dmops_get(struct xfs_mount *); extern void xfs_dmops_put(struct xfs_mount *); -#ifdef XFS_DMAPI +#if defined(CONFIG_XFS_DMAPI) || defined(CONFIG_XFS_DMAPI_MODULE) + +#define XFS_DMAPI /* XFS DMAPI support enabled (module or not) */ + +#include +#include extern struct xfs_dmops xfs_dmcore_xfs; @@ -232,7 +108,7 @@ extern void xfs_dmapi_event_attribute(st extern void xfs_dmapi_event_destroy(struct xfs_inode *); extern int xfs_dmapi_event_nospace(struct xfs_inode *); -#else /* ! XFS_DMAPI */ +#else /* !(defined(CONFIG_XFS_DMAPI) || defined(CONFIG_XFS_DMAPI_MODULE)) */ #define xfs_dmapi_event_enabled(i, e) 0 @@ -259,7 +135,7 @@ extern int xfs_dmapi_event_nospace(struc #define xfs_dmapi_event_destroy(ip) (void) 0 #define xfs_dmapi_event_nospace(ip) 0 -#endif /* ! XFS_DMAPI */ +#endif /* !(defined(CONFIG_XFS_DMAPI) || defined(CONFIG_XFS_DMAPI_MODULE)) */ #endif /* __XFS_DMAPI_H__ */ From aelder@sgi.com Mon Jun 28 17:04:07 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.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 o5SM47Gj044421 for ; Mon, 28 Jun 2010 17:04:07 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay1.corp.sgi.com (Postfix) with ESMTP id 114E58F80B7; Mon, 28 Jun 2010 15:06:53 -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 o5SM6q5F018255; Mon, 28 Jun 2010 17:06:52 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o5SM6qtR018254; Mon, 28 Jun 2010 17:06:52 -0500 From: Alex Elder Message-Id: <201006282206.o5SM6qtR018254@stout.americas.sgi.com> Date: Mon, 28 Jun 2010 17:06:52 -0500 To: xfs@oss.sgi.com Subject: [PATCH 15/15] xfs: move out remaining DMAPI definitions 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 Now move all that stuff that's not needed if DMAPI is not present at build time into a separate patch to be maintained out of tree. Signed-off-by: Alex Elder --- fs/xfs/xfs_dmapi.h | 79 ---------- fs/xfs/xfs_dmops.c | 406 ----------------------------------------------------- 2 files changed, 1 insertion(+), 484 deletions(-) Index: b/fs/xfs/xfs_dmapi.h =================================================================== --- a/fs/xfs/xfs_dmapi.h +++ b/fs/xfs/xfs_dmapi.h @@ -29,84 +29,7 @@ extern void xfs_dmops_put(struct xfs_mou #define XFS_DMAPI /* XFS DMAPI support enabled (module or not) */ -#include -#include - -extern struct xfs_dmops xfs_dmcore_xfs; - -typedef int (*xfs_send_data_t)(int, struct xfs_inode *, - xfs_off_t, size_t, int, int); -typedef int (*xfs_send_mmap_t)(struct vm_area_struct *, uint); -typedef int (*xfs_send_destroy_t)(struct xfs_inode *, dm_right_t); -typedef int (*xfs_send_namesp_t)(dm_eventtype_t, struct xfs_mount *, - struct xfs_inode *, dm_right_t, - struct xfs_inode *, dm_right_t, - const char *, const char *, mode_t, int, int); -typedef int (*xfs_send_mount_t)(struct xfs_mount *, dm_right_t, - char *, char *); -typedef void (*xfs_send_unmount_t)(struct xfs_mount *, struct xfs_inode *, - dm_right_t, mode_t, int, int); - -typedef struct xfs_dmops { - xfs_send_data_t xfs_send_data; - xfs_send_mmap_t xfs_send_mmap; - xfs_send_destroy_t xfs_send_destroy; - xfs_send_namesp_t xfs_send_namesp; - xfs_send_mount_t xfs_send_mount; - xfs_send_unmount_t xfs_send_unmount; -} xfs_dmops_t; - -/* - * DMAPI events only apply if DMAPI support was specified at mount - * time. If active, a particular DMAPI event can be enabled for - * all files the file system, or for individual files. - */ -static inline int -xfs_dmapi_event_enabled(struct xfs_inode *ip, dm_eventtype_t event) -{ - unsigned int event_mask = 1 << event; - - return ip->i_mount->m_dm_ops && - (ip->i_mount->m_dmevmask & event_mask || - ip->i_d.di_dmevmask & event_mask); -} - -/* Customized event functions, based on the DMAPI interfaces */ - -extern int xfs_dmapi_event_mount(struct xfs_mount *, char *); -extern void xfs_dmapi_event_preunmount(struct xfs_mount *); -extern void xfs_dmapi_event_unmount(struct xfs_mount *); - -extern int xfs_dmapi_event_create(struct xfs_inode *, const char *, - mode_t mode); -extern void xfs_dmapi_event_postcreate(struct xfs_inode *, - struct xfs_inode *, const char *, mode_t, int); -extern int xfs_dmapi_event_remove(struct xfs_inode *, const char *, - mode_t); -extern void xfs_dmapi_event_postremove(struct xfs_inode *, - const char *, mode_t, int); -extern int xfs_dmapi_event_rename(struct xfs_inode *, const char *, - struct xfs_inode *, const char *); -extern void xfs_dmapi_event_postrename(struct xfs_inode *, const - char *, struct xfs_inode *, const char *, int); -extern int xfs_dmapi_event_link(struct xfs_inode *, struct xfs_inode *, - const char *); -extern void xfs_dmapi_event_postlink(struct xfs_inode *, struct xfs_inode *, - const char *, int); -extern int xfs_dmapi_event_symlink(const char *, struct xfs_inode *, - const char *); -extern void xfs_dmapi_event_postsymlink(const char *, struct xfs_inode *, - struct xfs_inode *, const char *, int); -extern int xfs_dmapi_event_mmap(struct vm_area_struct *, unsigned long); -extern int xfs_dmapi_event_read(struct xfs_inode *, xfs_off_t, size_t, - int, int, int); -extern int xfs_dmapi_event_read_simple(struct xfs_inode *); -extern int xfs_dmapi_event_write(struct xfs_inode *, xfs_off_t, size_t, - int, int, int); -extern int xfs_dmapi_event_truncate(struct xfs_inode *, xfs_off_t, int); -extern void xfs_dmapi_event_attribute(struct xfs_inode *, int); -extern void xfs_dmapi_event_destroy(struct xfs_inode *); -extern int xfs_dmapi_event_nospace(struct xfs_inode *); +#include "dmapi/xfs_dmapi_event.h" #else /* !(defined(CONFIG_XFS_DMAPI) || defined(CONFIG_XFS_DMAPI_MODULE)) */ Index: b/fs/xfs/xfs_dmops.c =================================================================== --- a/fs/xfs/xfs_dmops.c +++ b/fs/xfs/xfs_dmops.c @@ -64,409 +64,3 @@ xfs_dmops_put(struct xfs_mount *mp) ASSERT(!mp->m_dm_ops); } -#ifdef XFS_DMAPI - -#define DM_OPS(mp) ((struct xfs_dmops *) (mp)->m_dm_ops) - -/* Private functions that encapsulate conditionally sending DMAPI messages */ - -static inline int -xfs_dmapi_send_data( - struct xfs_inode *ip, - dm_eventtype_t event, - xfs_off_t offset, - size_t length, - int flags, - int lock_flags) -{ - xfs_send_data_t send_data; - - if (! xfs_dmapi_event_enabled(ip, event)) - return 0; - send_data = DM_OPS(ip->i_mount)->xfs_send_data; - - return send_data(event, ip, offset, length, flags, lock_flags); -} - -static inline int -xfs_dmapi_send_mmap( - struct vm_area_struct *vma, - unsigned long vm_flags) -{ - struct inode *inode = vma->vm_file->f_path.dentry->d_inode; - struct xfs_mount *mp = XFS_M(inode->i_sb); - - if (mp->m_dm_ops) { - xfs_send_mmap_t send_mmap = DM_OPS(mp)->xfs_send_mmap; - - return send_mmap(vma, vm_flags); - } - ASSERT_ALWAYS(vm_flags == VM_WRITE); - - return 0; -} - -static inline int -xfs_dmapi_send_destroy( - struct xfs_inode *ip, - dm_right_t right) -{ - xfs_send_destroy_t send_destroy; - - if (!xfs_dmapi_event_enabled(ip, DM_EVENT_DESTROY)) - return 0; - send_destroy = DM_OPS(ip->i_mount)->xfs_send_destroy; - - return send_destroy(ip, right); -} - -static inline int -xfs_dmapi_send_namesp( - struct xfs_inode *ip1, - dm_right_t right1, - const char *name1, - dm_eventtype_t event, - struct xfs_inode *ip2, - dm_right_t right2, - const char *name2, - mode_t mode, - int ret, - int flags) -{ - int enabled; - xfs_send_namesp_t send_namesp; - - ASSERT(ip1 != NULL); - if (ip2 && ip1->i_mount != ip2->i_mount) - return -EINVAL; - - switch (event) { - case DM_EVENT_PREUNMOUNT: /* xfs_dmapi_send_preunmount() */ - enabled = 1; - break; - case DM_EVENT_CREATE: - case DM_EVENT_POSTCREATE: - case DM_EVENT_REMOVE: - case DM_EVENT_POSTREMOVE: - case DM_EVENT_LINK: - case DM_EVENT_POSTLINK: - case DM_EVENT_SYMLINK: - case DM_EVENT_POSTSYMLINK: - case DM_EVENT_ATTRIBUTE: - case DM_EVENT_NOSPACE: - enabled = xfs_dmapi_event_enabled(ip1, event); - break; - case DM_EVENT_RENAME: - case DM_EVENT_POSTRENAME: - enabled = xfs_dmapi_event_enabled(ip1, event) || - xfs_dmapi_event_enabled(ip2, event); - break; - default: - ASSERT(0); - enabled = 0; - break; - } - if (!enabled) - return 0; - - send_namesp = DM_OPS(ip1->i_mount)->xfs_send_namesp; - - return send_namesp(event, NULL, ip1, right1, ip2, right2, - name1, name2, mode, ret, flags); -} - -static inline int -xfs_dmapi_send_mount( - struct xfs_mount *mp, - char *path) -{ - if (mp->m_dm_ops) { - xfs_send_mount_t send_mount = DM_OPS(mp)->xfs_send_mount; - - return send_mount(mp, DM_RIGHT_NULL, path, mp->m_fsname); - } - - return ENOSYS; -} - -#define XFS_DMAPI_UNMOUNT_FLAGS(mp) \ - (((mp)->m_dmevmask & (1 << DM_EVENT_UNMOUNT)) ? 0 : DM_FLAGS_UNWANTED) - -static inline void -xfs_dmapi_send_preunmount( - struct xfs_mount *mp) -{ - if (mp->m_dm_ops) - (void) xfs_dmapi_send_namesp(mp->m_rootip, DM_RIGHT_NULL, NULL, - DM_EVENT_PREUNMOUNT, - mp->m_rootip, DM_RIGHT_NULL, NULL, - 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); -} - -static inline void -xfs_dmapi_send_unmount( - struct xfs_mount *mp) -{ - if (mp->m_dm_ops) { - xfs_send_unmount_t send_unmount = - DM_OPS(mp)->xfs_send_unmount; - - send_unmount(mp, mp->m_rootip, DM_RIGHT_NULL, - 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); - } -} - -/* - * Exported event functions, which translate file system events into - * the DMAPI messages they should send. - */ - -/* Mount point events */ - -int -xfs_dmapi_event_mount( - struct xfs_mount *mp, - char *path) -{ - return xfs_dmapi_send_mount(mp, path); -} - -void -xfs_dmapi_event_preunmount( - struct xfs_mount *mp) -{ - xfs_dmapi_send_preunmount(mp); -} - -void -xfs_dmapi_event_unmount( - struct xfs_mount *mp) -{ - xfs_dmapi_send_unmount(mp); -} - -/* Inode events */ - -int -xfs_dmapi_event_create( - struct xfs_inode *dip, - const char *name, - mode_t mode) -{ - return xfs_dmapi_send_namesp(dip, DM_RIGHT_NULL, name, - DM_EVENT_CREATE, - NULL, DM_RIGHT_NULL, NULL, - mode, 0, 0); -} - -void -xfs_dmapi_event_postcreate( - struct xfs_inode *dip, - struct xfs_inode *ip, - const char *name, - mode_t mode, - int retcode) -{ - (void) xfs_dmapi_send_namesp(dip, DM_RIGHT_NULL, name, - DM_EVENT_POSTCREATE, - ip, DM_RIGHT_NULL, NULL, - mode, retcode, 0); -} - -int -xfs_dmapi_event_remove( - struct xfs_inode *dip, - const char *name, - mode_t mode) -{ - return xfs_dmapi_send_namesp(dip, DM_RIGHT_NULL, name, - DM_EVENT_REMOVE, - NULL, DM_RIGHT_NULL, NULL, - mode, 0, 0); -} - -void -xfs_dmapi_event_postremove( - struct xfs_inode *dip, - const char *name, - mode_t mode, - int retcode) -{ - (void) xfs_dmapi_send_namesp(dip, DM_RIGHT_NULL, name, - DM_EVENT_POSTREMOVE, - NULL, DM_RIGHT_NULL, NULL, - mode, retcode, 0); -} - -int -xfs_dmapi_event_rename( - struct xfs_inode *src_dip, - const char *src_name, - struct xfs_inode *tgt_dip, - const char *tgt_name) -{ - return xfs_dmapi_send_namesp(src_dip, DM_RIGHT_NULL, src_name, - DM_EVENT_RENAME, - tgt_dip, DM_RIGHT_NULL, tgt_name, - 0, 0, 0); -} - -void -xfs_dmapi_event_postrename( - struct xfs_inode *src_dip, - const char *src_name, - struct xfs_inode *tgt_dip, - const char *tgt_name, - int retcode) -{ - (void) xfs_dmapi_send_namesp(src_dip, DM_RIGHT_NULL, src_name, - DM_EVENT_POSTRENAME, - tgt_dip, DM_RIGHT_NULL, tgt_name, - 0, retcode, 0); -} - -int -xfs_dmapi_event_link( - struct xfs_inode *src_ip, - struct xfs_inode *tgt_dip, - const char *tgt_name) -{ - return xfs_dmapi_send_namesp(tgt_dip, DM_RIGHT_NULL, tgt_name, - DM_EVENT_LINK, - src_ip, DM_RIGHT_NULL, NULL, - 0, 0, 0); -} - -void -xfs_dmapi_event_postlink( - struct xfs_inode *src_ip, - struct xfs_inode *tgt_dip, - const char *tgt_name, - int retcode) -{ - (void) xfs_dmapi_send_namesp(tgt_dip, DM_RIGHT_NULL, tgt_name, - DM_EVENT_POSTLINK, - src_ip, DM_RIGHT_NULL, NULL, - 0, retcode, 0); -} - -int -xfs_dmapi_event_symlink( - const char *path, /* pointed-to path */ - struct xfs_inode *tgt_dip, - const char *tgt_name) -{ - return xfs_dmapi_send_namesp(tgt_dip, DM_RIGHT_NULL, tgt_name, - DM_EVENT_SYMLINK, - NULL, DM_RIGHT_NULL, path, - 0, 0, 0); -} - -void -xfs_dmapi_event_postsymlink( - const char *path, /* pointed-to path */ - struct xfs_inode *tgt_dip, - struct xfs_inode *tgt_ip, /* ignored if retcode != 0 */ - const char *tgt_name, - int retcode) -{ - (void) xfs_dmapi_send_namesp(tgt_dip, DM_RIGHT_NULL, tgt_name, - DM_EVENT_POSTSYMLINK, - retcode ? NULL : tgt_ip, DM_RIGHT_NULL, path, - 0, retcode, 0); -} - -int -xfs_dmapi_event_mmap( - struct vm_area_struct *vma, - unsigned long vm_flags) -{ - return xfs_dmapi_send_mmap(vma, vm_flags); -} - -int -xfs_dmapi_event_read( - struct xfs_inode *ip, - xfs_off_t offset, - size_t length, - int non_blocking, - int direct_io, - int lock_flags) -{ - int dmflags = non_blocking ? DM_FLAGS_NDELAY : 0; - - if (direct_io) - dmflags |= DM_FLAGS_IMUX; - - return xfs_dmapi_send_data(ip, DM_EVENT_READ, offset, - length, dmflags, lock_flags); -} - -int -xfs_dmapi_event_read_simple( - struct xfs_inode *ip) -{ - return xfs_dmapi_event_read(ip, 0, 0, 0, 0, 0); -} - -int -xfs_dmapi_event_write( - struct xfs_inode *ip, - xfs_off_t offset, - size_t length, - int non_blocking, - int direct_io, - int lock_flags) -{ - int dmflags = non_blocking ? DM_FLAGS_NDELAY : 0; - - if (direct_io) - dmflags |= DM_FLAGS_IMUX; - - return xfs_dmapi_send_data(ip, DM_EVENT_WRITE, offset, - length, dmflags, lock_flags); -} - -int -xfs_dmapi_event_truncate( - struct xfs_inode *ip, - xfs_off_t size, - int non_blocking) -{ - int dmflags = DM_FLAGS_IALLOCSEM_WR|DM_FLAGS_IMUX; - - if (non_blocking) - dmflags |= DM_FLAGS_NDELAY; - - return xfs_dmapi_send_data(ip, DM_EVENT_TRUNCATE, size, 0, dmflags, 0); -} - -void -xfs_dmapi_event_attribute( - struct xfs_inode *ip, - int delay) -{ - (void) xfs_dmapi_send_namesp(ip, DM_RIGHT_NULL, NULL, - DM_EVENT_ATTRIBUTE, - NULL, DM_RIGHT_NULL, NULL, - 0, 0, delay ? DM_FLAGS_NDELAY : 0); -} - -void -xfs_dmapi_event_destroy( - struct xfs_inode *ip) -{ - (void) xfs_dmapi_send_destroy(ip, DM_RIGHT_NULL); -} - -int -xfs_dmapi_event_nospace( - struct xfs_inode *ip) -{ - return xfs_dmapi_send_namesp(ip, DM_RIGHT_NULL, NULL, - DM_EVENT_NOSPACE, - ip, DM_RIGHT_NULL, NULL, - 0, 0, 0); /* Delay flag intentionally unused */ -} - -#endif /* XFS_DMAPI */ From BATV+a943b9d3351e01f936e3+2501+infradead.org+hch@bombadil.srs.infradead.org Tue Jun 29 02:54: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 o5T7spGT067896 for ; Tue, 29 Jun 2010 02:54:52 -0500 X-ASG-Debug-ID: 1277798544-7bd402730000-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 4DD3014B262C; Tue, 29 Jun 2010 01:02:25 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 4f1EZc2b2X9sSGar; Tue, 29 Jun 2010 01:02:25 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OTVhG-0000PP-R9; Tue, 29 Jun 2010 07:57:34 +0000 Date: Tue, 29 Jun 2010 03:57:34 -0400 From: Christoph Hellwig To: Alex Elder Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: Re: [PATCH 00/15] xfs: minimize DMAPI footprint Subject: Re: [PATCH 00/15] xfs: minimize DMAPI footprint Message-ID: <20100629075734.GA31118@infradead.org> References: <1277762653.2040.554.camel@doink> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1277762653.2040.554.camel@doink> 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: 1277798545 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean > SGI has a product that uses the DMAPI support code that's > included in mainline XFS, along with some additional code > (the "never merged" stuff Christoph refers to) that we > maintain separately. To our customers that need it, this > is an extremely important feature. So why don't you bother to get HSM support upstream properly, or at least maintain it somewhere where you can get at it? What sourcxe tree do those important customers use it? > What follows is a set of patches that I think accomplishes > these goals. The net result of these changes is: While this is a lot better than the old DMAPI supoort, it's still lots of dead code in the mainline tree, that won't ever be used there, as proper HSM suport if it ever was merged would sit at the VFS layer. In addition to that the people who effectively maintain XFS for both the community and lots of paying customers have done a large amount of work ontop of the DMAPI removal of the last 1 1/2 month. So I'd say rebase your changes over http://git.kernel.org/?p=linux/kernel/git/dgc/xfsdev.git;a=shortlog;h=refs/heads/for-2.6.36 and keep them in a separate branch dmapi-dev branch where SGI can pull the code for it's customers from. This branch could also include the actual dmapi code and core kernel modifications, so that people that want dmapi support actually have chance to find a complete kernel tree for it. I'd also hope you have fixed grave bugs like the oops on unmount after multiple mount one I pointed out to SGI about two years ago, but which still wasn't fixed inthe last dmapi enabled tree. From BATV+a943b9d3351e01f936e3+2501+infradead.org+hch@bombadil.srs.infradead.org Tue Jun 29 02:56: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 o5T7uBcG067946 for ; Tue, 29 Jun 2010 02:56:11 -0500 X-ASG-Debug-ID: 1277798337-48ae00180000-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 C343B1568D6B; Tue, 29 Jun 2010 00:58:57 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id JL0SW2CbnhfrALsk; Tue, 29 Jun 2010 00:58:57 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OTViZ-0002kf-M9; Tue, 29 Jun 2010 07:58:55 +0000 Date: Tue, 29 Jun 2010 03:58:55 -0400 From: Christoph Hellwig To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 09/15] xfs: rewrite XFS_SEND_NAMESP() as a function Subject: Re: [PATCH 09/15] xfs: rewrite XFS_SEND_NAMESP() as a function Message-ID: <20100629075855.GB31118@infradead.org> References: <201006282205.o5SM5qNZ018194@stout.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201006282205.o5SM5qNZ018194@stout.americas.sgi.com> 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: 1277798337 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean A lot of arguments for the namesp even are always NULL or use defaults. You'll make your life a simpler by just removing them. This also applies to some of the other dmapi callout, but it's most extreme here. From BATV+a943b9d3351e01f936e3+2501+infradead.org+hch@bombadil.srs.infradead.org Tue Jun 29 08:32:17 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5TDWG71080360 for ; Tue, 29 Jun 2010 08:32:17 -0500 X-ASG-Debug-ID: 1277818790-2f7a012c0000-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 640F815A98D8; Tue, 29 Jun 2010 06:39:50 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id fyYFi1Ec6CgdMytU; Tue, 29 Jun 2010 06:39:50 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OTaxo-0004u7-Ei; Tue, 29 Jun 2010 13:35:00 +0000 Date: Tue, 29 Jun 2010 09:35:00 -0400 From: Christoph Hellwig To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 03/15] xfs: move DMAPI definitions out of "xfs_mount.h" Subject: Re: [PATCH 03/15] xfs: move DMAPI definitions out of "xfs_mount.h" Message-ID: <20100629133500.GA11312@infradead.org> References: <201006282204.o5SM4qbU018132@stout.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201006282204.o5SM4qbU018132@stout.americas.sgi.com> 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: 1277818790 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Jun 28, 2010 at 05:04:52PM -0500, Alex Elder wrote: > XFS defines a bunch of DMAPI cruft in xfs_mount.h. There is no need > for it to be there; move it instead into the xfs_dmapi.h file. A > side-effect of this is that "xfs_dmapi.h" now depends on and needs > to be #included after "xfs_mount.h" and "xfs_inode.h" (the latter of > which itself depends on a "xfs_bmap_btree.h"). > > On the other hand, "xfs_dmapi.h" is #included by a LOT more files > than it needs to be, so eliminate those cases. > > Finally, "xfs_inode.h" defines a type dm_attrs_t that is never > referenced anywhere else, so kill it off. Asserting copyright on removing single include lines seems rather interesting.. From nailman23@gmail.com Tue Jun 29 09:18:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.9 required=5.0 tests=BAYES_50,FREEMAIL_FROM, HTML_MESSAGE,J_CHICKENPOX_44,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5TEIwMV081602 for ; Tue, 29 Jun 2010 09:18:58 -0500 X-ASG-Debug-ID: 1277821303-6a1503570000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from fg-out-2122.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 533861E1862C for ; Tue, 29 Jun 2010 07:21:43 -0700 (PDT) Received: from fg-out-2122.google.com (fg-out-2122.google.com [72.14.220.24]) by cuda.sgi.com with ESMTP id bQIHlOAAvkoHCC2g for ; Tue, 29 Jun 2010 07:21:43 -0700 (PDT) Received: by fg-out-2122.google.com with SMTP id e9so77959fga.8 for ; Tue, 29 Jun 2010 07:21:42 -0700 (PDT) MIME-Version: 1.0 Received: by 10.87.38.12 with SMTP id q12mr479417fgj.8.1277821302005; Tue, 29 Jun 2010 07:21:42 -0700 (PDT) Message-ID: <001636458d40cae4e1048a2bf4e9@google.com> Date: Tue, 29 Jun 2010 14:21:42 +0000 X-ASG-Orig-Subj: XFS and Extended ACLs Subject: XFS and Extended ACLs From: nailman23@gmail.com To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001636458d40cae4ce048a2bf4e6 X-Barracuda-Connect: fg-out-2122.google.com[72.14.220.24] X-Barracuda-Start-Time: 1277821304 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0003 1.0000 -2.0193 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_MESSAGE, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33907 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --001636458d40cae4ce048a2bf4e6 Content-Type: text/plain; charset=ISO-8859-1; format=flowed; delsp=yes Hi All, I have an issue with extended ACLs. The situation is as follows: 1) There are two users (UserA and UserB) 2) They belong to the same group (users) 3) The SAMBA share called "test" has user access enabled for UserA and UserB 4) The UserA creates test.docx file on the "test" share and he becomes the owner of the file. 5) Then UserB edits the test.docx file and save changes. After that UserB becomes the owner. It is not an issue because when editing the file Word creates new temporary file and then, during saving, overwrites the original file. The issue is when you check ACLs entry you will see that UserA has his own ACLs entries, although he already belongs to the "users" groups. This occurs when the share has XFS file system in the bottom. Then I have created an ext3 file system on the logical volume and after performing all steps, the UserB was owner of the file, but the UserA was no longer listed in ACLs entries. It seems the issue comes from XFS and the way as the XFS handles the ACLs permissions. The smb.conf is exactly the same in both cases so I do not believe it is SAMBA issue, but if you want I can send the smb.conf file. Do you know if there is way I could overcome this, in other words, that XFS would behave in the same manner as ie ext3. Thank you in advance. Slawek --001636458d40cae4ce048a2bf4e6 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Hi All,

I have an issue with extended ACLs. The situation is as = follows:
1) There are two users (UserA and UserB)
2) They belong = to the same group (users)
3) The SAMBA share called "test" h= as user access enabled for UserA and UserB
4) The UserA creates test.d= ocx file on the "test" share and he becomes the owner of the file= .
5) Then UserB edits the test.docx file and save changes. After that = UserB becomes the owner. It is not an issue because when editing the file W= ord creates new temporary file and then, during saving, overwrites the orig= inal file. The issue is when you check ACLs entry you will see that UserA h= as his own ACLs entries, although he already belongs to the "users&quo= t; groups.

This occurs when the share has XFS file system in the= bottom.

Then I have created an ext3 file system on the logical = volume and after performing all steps, the UserB was owner of the file, but= the UserA was no longer listed in ACLs entries.

It seems the is= sue comes from XFS and the way as the XFS handles the ACLs permissions.
The smb.conf is exactly the same in both cases so I do not believe= it is SAMBA issue, but if you want I can send the smb.conf file.

Do you know if there is way I could overcome this, in other words, that X= FS would behave in the same manner as i.e. ext3.

Thank you in ad= vance.

Slawek --001636458d40cae4ce048a2bf4e6-- From apache2@racer.rtt4.net Tue Jun 29 12:46:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.9 required=5.0 tests=BAYES_60,FORGED_HOTMAIL_RCVD2, FREEMAIL_FROM,HK_NAME_FREE,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5THkRct087546 for ; Tue, 29 Jun 2010 12:46:28 -0500 X-ASG-Debug-ID: 1277833751-78ca00660000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from racer.rtt4.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 29F771531C67 for ; Tue, 29 Jun 2010 10:49:12 -0700 (PDT) Received: from racer.rtt4.net (gw01.rtt4.net [80.74.153.40]) by cuda.sgi.com with ESMTP id bEAOejTs0NY4E9aP for ; Tue, 29 Jun 2010 10:49:12 -0700 (PDT) Received: from apache2 by racer.rtt4.net with local (Exim 4.63) (envelope-from ) id 1OTevm-0002lc-HA for xfs@oss.sgi.com; Tue, 29 Jun 2010 19:49:10 +0200 To: xfs@oss.sgi.com X-ASG-Orig-Subj: free phone system network call telephone internet voip Gateway Mrirtvb.com/viop Subject: free phone system network call telephone internet voip Gateway Mrirtvb.com/viop From: Free phone Reply-To: MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 8bit Message-Id: Date: Tue, 29 Jun 2010 19:49:10 +0200 X-Barracuda-Connect: gw01.rtt4.net[80.74.153.40] X-Barracuda-Start-Time: 1277833753 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0439 1.0000 -1.7380 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=FORGED_HOTMAIL_RCVD2, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33919 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 1.12 FORGED_HOTMAIL_RCVD2 hotmail.com 'From' address, but no 'Received:' X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean free phone system network call telephone internet voip Gateway http://www.mrirtvb.com/viop From xfs@tlinx.org Tue Jun 29 17: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=-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 o5TMUhi8095094 for ; Tue, 29 Jun 2010 17:30:43 -0500 X-ASG-Debug-ID: 1277850808-49a3016d0000-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 EA20E1E1969F for ; Tue, 29 Jun 2010 15:33:28 -0700 (PDT) Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id 7rIEFXJL7IhjAhoR for ; Tue, 29 Jun 2010 15:33:28 -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 o5TMX2Zw007128; Tue, 29 Jun 2010 15:33:05 -0700 Message-ID: <4C2A749E.4060006@tlinx.org> Date: Tue, 29 Jun 2010 15:33:02 -0700 From: Linda Walsh User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: Dave Chinner , xfs-oss X-ASG-Orig-Subj: Re: xfs file system in process of becoming corrupt; though xfs_repair thinks it's fine! ;-/ (was xfs_dump problem...) Subject: Re: xfs file system in process of becoming corrupt; though xfs_repair thinks it's fine! ;-/ (was xfs_dump problem...) References: <4C26A51F.8020909@tlinx.org> <20100628022744.GX6590@dastard> In-Reply-To: <20100628022744.GX6590@dastard> X-Stationery: 0.5.1 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1277850808 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33939 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dave Chinner wrote: > Can you get a list of all the attributes and their sizes on the > inodes xfsdump is complaining about? > > Cheers, > > Dave. Wish I could...had a software problem that had me have to reuse the drive I just copied those examples from. But have another XFS problem that is much more reliably persistent. I don't know if they are at all related, but since I have this problem that's a bit "stuck", it's easier to "reproduce". Filesystem is one of my larger ones: Ishtar:/Torrents> 'df' -T --sync . Filesystem Type 1K-blocks Used Available Use% Mounted on /dev/dm-7 xfs 6442319744 2305631080 4136688664 36% /Torrents Ishtar:/Torrents> 'df' -iT --sync . Filesystem Type Inodes IUsed IFree IUse% Mounted on /dev/dm-7 xfs 1288490112 34313 1288455799 1% /Torrents I have 3 files that developed 'bugs' in them in 3 separate directories. Oddly, they were they were 3 copies of the same 3 files. Very Odd. Symptom is from ls: --------------------------------------------------------------------------------------------------- Ishtar:/Torrents> 'ls' -ni bad* ls: cannot access bad/30-Omoide to Yakusoku (TV saizu|Reinaʼs Ver.).mp3: No such file or directory ls: cannot access bad/31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3: No such file or directory ls: cannot access bad/32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3: No such file or directory bad: total 0 2359101 ?????????? ? ? ? ? ? 30-Omoide to Yakusoku (TV saizu|Reinaʼs Ver.).mp3 2354946 ?????????? ? ? ? ? ? 31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3 2354949 ?????????? ? ? ? ? ? 32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3 ls: cannot access bad2/30-Omoide to Yakusoku (TV saizu|Reinaʼs Ver.).mp3: No such file or directory ls: cannot access bad2/31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3: No such file or directory ls: cannot access bad2/32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3: No such file or directory bad2: total 0 2220560 ?????????? ? ? ? ? ? 30-Omoide to Yakusoku (TV saizu|Reinaʼs Ver.).mp3 2220561 ?????????? ? ? ? ? ? 31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3 2218302 ?????????? ? ? ? ? ? 32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3 ls: cannot access bad3/30-Omoide to Yakusoku (TV saizu|Reinaʼs Ver.).mp3: No such file or directory ls: cannot access bad3/31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3: No such file or directory ls: cannot access bad3/32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3: No such file or directory bad3: total 0 2218295 ?????????? ? ? ? ? ? 30-Omoide to Yakusoku (TV saizu|Reinaʼs Ver.).mp3 2218296 ?????????? ? ? ? ? ? 31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3 2218297 ?????????? ? ? ? ? ? 32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3 --------------------------------------------------------------------------------------------------- The file system, labeled 'Torrents' is layered on a lvm base (I'm not convinced that lvm is as reliable as physical partitions at this point, which is why I mention it). It's a 'live' file system. What info do you want me to dump from it? I'm dumping the files from it now, so I can try to remake the file system. The problem is 'spreading' to "new" files. Basically, any file that is being written to now, seems to be in danger of becoming inaccessible. Also, FWIW -- I did unmount the file system and run xfs_repair. It finds no problems -- so why are these files not accessible? Ideas? Next steps? Thanks! Linda From SRS0+hLT1+29+fromorbit.com=david@internode.on.net Tue Jun 29 18:13:02 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,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 o5TND2Ix097068 for ; Tue, 29 Jun 2010 18:13:02 -0500 X-ASG-Debug-ID: 1277853346-1b1f00060000-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 25FCB4193F4 for ; Tue, 29 Jun 2010 16:15:46 -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 UOvi5wBs2CbrCOHN for ; Tue, 29 Jun 2010 16:15:46 -0700 (PDT) Received: from dastard (unverified [121.44.238.155]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 30010969-1927428 for multiple; Wed, 30 Jun 2010 08:45:45 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OTk1n-0006QW-Ud; Wed, 30 Jun 2010 09:15:43 +1000 Date: Wed, 30 Jun 2010 09:15:43 +1000 From: Dave Chinner To: nailman23@gmail.com Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS and Extended ACLs Subject: Re: XFS and Extended ACLs Message-ID: <20100629231543.GC6590@dastard> References: <001636458d40cae4e1048a2bf4e9@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <001636458d40cae4e1048a2bf4e9@google.com> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail14.adl6.internode.on.net[150.101.137.99] X-Barracuda-Start-Time: 1277853348 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33941 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 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 29, 2010 at 02:21:42PM +0000, nailman23@gmail.com wrote: > Hi All, > > I have an issue with extended ACLs. The situation is as follows: > 1) There are two users (UserA and UserB) > 2) They belong to the same group (users) > 3) The SAMBA share called "test" has user access enabled for UserA and UserB > 4) The UserA creates test.docx file on the "test" share and he > becomes the owner of the file. > 5) Then UserB edits the test.docx file and save changes. After that > UserB becomes the owner. It is not an issue because when editing the > file Word creates new temporary file and then, during saving, > overwrites the original file. The issue is when you check ACLs entry > you will see that UserA has his own ACLs entries, although he > already belongs to the "users" groups. > > This occurs when the share has XFS file system in the bottom. > > Then I have created an ext3 file system on the logical volume and > after performing all steps, the UserB was owner of the file, but the > UserA was no longer listed in ACLs entries. Can you provide a script that demonstrates the problem? > It seems the issue comes from XFS and the way as the XFS handles the > ACLs permissions. XFS uses the most of the generic code for getting and setting ACLs, so there shouldn't be any difference unless there is a bug or you are using an old kernel. What kernel are you running? Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+IrPP+29+fromorbit.com=david@internode.on.net Tue Jun 29 18:22: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 o5TNMoDL097341 for ; Tue, 29 Jun 2010 18:22:51 -0500 X-ASG-Debug-ID: 1277853934-498f021e0000-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 57CD01D61F0C for ; Tue, 29 Jun 2010 16:25:35 -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 oOhPFAb6O8XlWZPf for ; Tue, 29 Jun 2010 16:25:35 -0700 (PDT) Received: from dastard (unverified [121.44.238.155]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 29581931-1927428 for multiple; Wed, 30 Jun 2010 08:55:34 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OTkBI-0006RP-FX; Wed, 30 Jun 2010 09:25:32 +1000 Date: Wed, 30 Jun 2010 09:25:32 +1000 From: Dave Chinner To: Linda Walsh Cc: xfs-oss X-ASG-Orig-Subj: Re: xfs file system in process of becoming corrupt; though xfs_repair thinks it's fine! ;-/ (was xfs_dump problem...) Subject: Re: xfs file system in process of becoming corrupt; though xfs_repair thinks it's fine! ;-/ (was xfs_dump problem...) Message-ID: <20100629232532.GA24712@dastard> References: <4C26A51F.8020909@tlinx.org> <20100628022744.GX6590@dastard> <4C2A749E.4060006@tlinx.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <4C2A749E.4060006@tlinx.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: 1277853936 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33943 Rule breakdown below pts rule 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 29, 2010 at 03:33:02PM -0700, Linda Walsh wrote: > Dave Chinner wrote: > >Can you get a list of all the attributes and their sizes on the > >inodes xfsdump is complaining about? > > > >Cheers, > > > >Dave. > Wish I could...had a software problem that had me have to reuse the > drive I just copied those examples from. > > But have another XFS problem that is much more reliably persistent. > I don't know if they are at all related, but since I have this problem > that's a bit "stuck", it's easier to "reproduce". > > Filesystem is one of my larger ones: > > Ishtar:/Torrents> 'df' -T --sync . > Filesystem Type 1K-blocks Used Available Use% Mounted on > /dev/dm-7 xfs 6442319744 2305631080 4136688664 36% /Torrents > Ishtar:/Torrents> 'df' -iT --sync . > Filesystem Type Inodes IUsed IFree IUse% Mounted on > /dev/dm-7 xfs 1288490112 34313 1288455799 1% /Torrents > > I have 3 files that developed 'bugs' in them in 3 separate > directories. Oddly, they were they were 3 copies of the same 3 > files. Very Odd. > > Symptom is from ls: > --------------------------------------------------------------------------------------------------- > Ishtar:/Torrents> 'ls' -ni bad* ls: cannot access bad/30-Omoide > to Yakusoku (TV saizu|Reinaʼs Ver.).mp3: No such file or directory > ls: cannot access bad/31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3: No such file or directory > ls: cannot access bad/32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3: No such file or directory > bad: > total 0 > 2359101 ?????????? ? ? ? ? ? 30-Omoide to Yakusoku (TV saizu|Reinaʼs Ver.).mp3 > 2354946 ?????????? ? ? ? ? ? 31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3 > 2354949 ?????????? ? ? ? ? ? 32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3 > ls: cannot access bad2/30-Omoide to Yakusoku (TV saizu|Reinaʼs Ver.).mp3: No such file or directory > ls: cannot access bad2/31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3: No such file or directory > ls: cannot access bad2/32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3: No such file or directory Those file names have a weird character in them - are you sure that the terminal supports that character set and is not mangling it and hence not matching what is actually stored on disk? > The file system, labeled 'Torrents' is layered on a lvm base (I'm not convinced that > lvm is as reliable as physical partitions at this point, which is why I mention it). > > It's a 'live' file system. What info do you want me to dump from it? > > I'm dumping the files from it now, so I can try to remake the file system. > > The problem is 'spreading' to "new" files. Basically, any file that is being written to > now, seems to be in danger of becoming inaccessible. Do those "new" files have the same strange characters in them? > Also, FWIW -- I did unmount the file system and run xfs_repair. It > finds no problems -- so why are these files not accessible? If there are no problems reported by repair, then I suspect that it's a terminal level problem... Cheers, Dave. -- Dave Chinner david@fromorbit.com From mw@dermichi.com Tue Jun 29 18:53: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 o5TNr4we098287 for ; Tue, 29 Jun 2010 18:53:05 -0500 X-ASG-Debug-ID: 1277856040-5eda039c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from firestarter.dermichi.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BD6761171B28 for ; Tue, 29 Jun 2010 17:00:41 -0700 (PDT) Received: from firestarter.dermichi.com (firestarter.dermichi.com [78.41.115.230]) by cuda.sgi.com with ESMTP id ZcecmuaJVBgzyzk5 for ; Tue, 29 Jun 2010 17:00:41 -0700 (PDT) Received: from moonwalker.lan.dermichi.com ([2001:15c0:6679:1:218:8bff:feb1:c9e8]) by firestarter.dermichi.com with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.72) (envelope-from ) id 1OTkeZ-0006rH-0N for xfs@oss.sgi.com; Wed, 30 Jun 2010 01:55:47 +0200 Message-ID: <4C2A87FF.7090804@dermichi.com> Date: Wed, 30 Jun 2010 01:55:43 +0200 From: Michael Weissenbacher User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100423 Thunderbird/3.0.4 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs file system in process of becoming corrupt; though xfs_repair thinks it's fine! ;-/ (was xfs_dump problem...) Subject: Re: xfs file system in process of becoming corrupt; though xfs_repair thinks it's fine! ;-/ (was xfs_dump problem...) References: <4C26A51F.8020909@tlinx.org> <20100628022744.GX6590@dastard> <4C2A749E.4060006@tlinx.org> <20100629232532.GA24712@dastard> In-Reply-To: <20100629232532.GA24712@dastard> X-Enigmail-Version: 1.0.1 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: firestarter.dermichi.com[78.41.115.230] X-Barracuda-Start-Time: 1277856041 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0032 1.0000 -1.9999 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.00 X-Barracuda-Spam-Status: No, SCORE=-2.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33944 Rule breakdown below pts rule 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! >> 2359101 ?????????? ? ? ? ? ? 30-Omoide to Yakusoku (TV saizu|Reinaʼs Ver.).mp3 >> 2354946 ?????????? ? ? ? ? ? 31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3 >> 2354949 ?????????? ? ? ? ? ? 32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3 >> ls: cannot access bad2/30-Omoide to Yakusoku (TV saizu|Reinaʼs Ver.).mp3: No such file or directory >> ls: cannot access bad2/31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3: No such file or directory >> ls: cannot access bad2/32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3: No such file or directory > > ... > > If there are no problems reported by repair, then I suspect that > it's a terminal level problem... > Looking at this i remember having similar problems when my filesystems was mounted with inode64 before and after i left out that parameter. So Linda, could you re-try mounting the fs with "inode64". cheers, Michael From xfs@tlinx.org Tue Jun 29 18:58:34 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5TNwXVH098495 for ; Tue, 29 Jun 2010 18:58:34 -0500 X-ASG-Debug-ID: 1277856079-1b1001500000-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 0E6FB419361 for ; Tue, 29 Jun 2010 17:01:19 -0700 (PDT) Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id dLIVfh5HTHbEj4Yn for ; Tue, 29 Jun 2010 17:01:19 -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 o5U01C01011282; Tue, 29 Jun 2010 17:01:14 -0700 Message-ID: <4C2A8948.3030008@tlinx.org> Date: Tue, 29 Jun 2010 17:01:12 -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: Dave Chinner , xfs-oss X-ASG-Orig-Subj: Re: xfs file system in process of becoming corrupt; though xfs_repair thinks it's fine! ;-/ (was xfs_dump problem...) Subject: Re: xfs file system in process of becoming corrupt; though xfs_repair thinks it's fine! ;-/ (was xfs_dump problem...) References: <4C26A51F.8020909@tlinx.org> <20100628022744.GX6590@dastard> <4C2A749E.4060006@tlinx.org> <20100629232532.GA24712@dastard> In-Reply-To: <20100629232532.GA24712@dastard> X-Stationery: 0.5.1 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1277856080 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33945 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dave Chinner wrote: --------------------------------------------------------------------------------------------------- >> Ishtar:/Torrents> 'ls' -ni bad* ls: cannot access bad/30-Omoide >> to Yakusoku (TV saizu|Reinaʼs Ver.).mp3: No such file or directory >> ls: cannot access bad/31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3: No such file or directory >> ls: cannot access bad/32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3: No such file or directory >> bad: >> total 0 >> 2359101 ?????????? ? ? ? ? ? 30-Omoide to Yakusoku (TV saizu|Reinaʼs Ver.).mp3 >> 2354946 ?????????? ? ? ? ? ? 31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3 >> 2354949 ?????????? ? ? ? ? ? 32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3 >> ls: cannot access bad2/30-Omoide to Yakusoku (TV saizu|Reinaʼs Ver.).mp3: No such file or directory >> ls: cannot access bad2/31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3: No such file or directory >> ls: cannot access bad2/32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3: No such file or directory > > Those file names have a weird character in them - are you sure that > the terminal supports that character set and is not mangling it and > hence not matching what is actually stored on disk? ----- Those files were 'fine' before today. I know it is not a terminal problem -- I told ls to list all files in the directory -- then it says "no such file". Can you say that "*" shouldn't match everything? Those question marks are in the place for the size! There are no weird characters in those file names. Here are the same files in another directory: mp3> ll 3* -rwx------ 1 3255702 2010-06-14 10:54 30-Omoide to Yakusoku (TV saizu|Reinaʼs Ver.).mp3* -rwx------ 1 3272004 2010-06-14 10:54 31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3* -rwx------ 1 3234876 2010-06-14 10:54 32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3* The fields it can't display are the file size, time and dates! The names display ok! How can file size, time and date be in unprintable characters that "ls" can't display? From SRS0+ZvxJ+30+fromorbit.com=david@internode.on.net Tue Jun 29 19: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.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 o5U0I7d7099097 for ; Tue, 29 Jun 2010 19:18:07 -0500 X-ASG-Debug-ID: 1277857248-1b1801df0000-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 19AE6419445 for ; Tue, 29 Jun 2010 17:20:49 -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 AmxsZJbP8U1KLbyr for ; Tue, 29 Jun 2010 17:20:49 -0700 (PDT) Received: from dastard (unverified [121.44.238.155]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 29589133-1927428 for multiple; Wed, 30 Jun 2010 09:50:45 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OTl2h-0006Un-7x; Wed, 30 Jun 2010 10:20:43 +1000 Date: Wed, 30 Jun 2010 10:20:43 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Alex Elder , xfs@oss.sgi.com, linux-kernel@vger.kernel.org X-ASG-Orig-Subj: Re: [PATCH 00/15] xfs: minimize DMAPI footprint Subject: Re: [PATCH 00/15] xfs: minimize DMAPI footprint Message-ID: <20100630002043.GB24712@dastard> References: <1277762653.2040.554.camel@doink> <20100629075734.GA31118@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100629075734.GA31118@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: 1277857250 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33947 Rule breakdown below pts rule 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 29, 2010 at 03:57:34AM -0400, Christoph Hellwig wrote: > > SGI has a product that uses the DMAPI support code that's > > included in mainline XFS, along with some additional code > > (the "never merged" stuff Christoph refers to) that we > > maintain separately. To our customers that need it, this > > is an extremely important feature. > > So why don't you bother to get HSM support upstream properly, > or at least maintain it somewhere where you can get at it? > What sourcxe tree do those important customers use it? > > > What follows is a set of patches that I think accomplishes > > these goals. The net result of these changes is: > > While this is a lot better than the old DMAPI supoort, it's still > lots of dead code in the mainline tree, that won't ever be used > there, as proper HSM suport if it ever was merged would sit at > the VFS layer. My question about the DMAPI hooks also still stands - if we leave the hooks in mainline, how are we supposed to test that they are still placed correctly for the out-of-tree patches to function correctly? I can't see that we can actually do this, so I question the value of even leaving minimal hooks in place.... > In addition to that the people who effectively maintain XFS for both > the community and lots of paying customers have done a large amount > of work ontop of the DMAPI removal of the last 1 1/2 month. So I'd > say rebase your changes over > > http://git.kernel.org/?p=linux/kernel/git/dgc/xfsdev.git;a=shortlog;h=refs/heads/for-2.6.36 > > and keep them in a separate branch dmapi-dev branch where SGI can pull > the code for it's customers from. This branch could also include the > actual dmapi code and core kernel modifications, so that people that > want dmapi support actually have chance to find a complete kernel tree > for it. This makes a lot of sense to me. I'd prefer an all-or-nothing approach to supporting DMAPI (and any other out-of-tree enabling functionality for that matter) and putting it all in separate branch would give us both all and nothing. ;) It would also help us test the DMAPI infrastructure without needing a HSM as the xfsqa test suite does a pretty good job of testing it. And, of course, we could also help clean it up if it is testable. As such, I'd be quite happy to maintain a dmapi-dev branch in the above repo if the eventual goal is to try to move the code towards being more acceptible for mainline inclusion.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From xfs@tlinx.org Tue Jun 29 19: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 o5U0dPeE099654 for ; Tue, 29 Jun 2010 19:39:25 -0500 X-ASG-Debug-ID: 1277858822-70a503df0000-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 043031171CC7 for ; Tue, 29 Jun 2010 17:47:02 -0700 (PDT) Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id RzAEXgkwFhHuV2BR for ; Tue, 29 Jun 2010 17:47:02 -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 o5U0g2Ue012480; Tue, 29 Jun 2010 17:42:04 -0700 Message-ID: <4C2A92DA.1020202@tlinx.org> Date: Tue, 29 Jun 2010 17:42:02 -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: Michael Weissenbacher , xfs-oss X-ASG-Orig-Subj: Re: xfs file system in process of becoming corrupt; though xfs_repair thinks it's fine! ;-/ (was xfs_dump problem...) Subject: Re: xfs file system in process of becoming corrupt; though xfs_repair thinks it's fine! ;-/ (was xfs_dump problem...) References: <4C26A51F.8020909@tlinx.org> <20100628022744.GX6590@dastard> <4C2A749E.4060006@tlinx.org> <20100629232532.GA24712@dastard> <4C2A87FF.7090804@dermichi.com> In-Reply-To: <4C2A87FF.7090804@dermichi.com> X-Stationery: 0.5.1 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1277858823 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33948 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Michael Weissenbacher wrote: > Hi! >>> 2359101 ?????????? ? ? ? ? ? 30-Omoide to Yakusoku (TV saizu|Reinaʼs Ver.).mp3 >>> 2354946 ?????????? ? ? ? ? ? 31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3 >>> 2354949 ?????????? ? ? ? ? ? 32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3 >>> ls: cannot access bad2/30-Omoide to Yakusoku (TV saizu|Reinaʼs Ver.).mp3: No such file or directory >>> ls: cannot access bad2/31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3: No such file or directory >>> ls: cannot access bad2/32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3: No such file or directory >> ... >> >> If there are no problems reported by repair, then I suspect that >> it's a terminal level problem... >> > Looking at this i remember having similar problems when my filesystems > was mounted with inode64 before and after i left out that parameter. So > Linda, could you re-try mounting the fs with "inode64". ---- I ran into that before as well -- already tried Notice the listing you see is the output of "ls -in". Those numbers are the inodes. ...HEY, wait. When do you need 64-bit inodes? The dump size said it was: xfsdump: estimated dump size: 2360915740992 bytes It's getting right near to overflowing a 32-bit integer. Do I need >32 bit inodes if the filesystem size is > 2T? I'm guessing the file system just recently passed the 2G mark. Note -- I DID try the inode64 mount option -- it made no difference. But if you need 64-bit inodes for file systems > 2T file systems, then shouldn't I have gotten some error rather than it eating files for lunch? The inode numbers themselves, are not even close to being over 32bits. Sigh... From SRS0++WWN+30+fromorbit.com=david@internode.on.net Tue Jun 29 20:03: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 (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5U13eTL100408 for ; Tue, 29 Jun 2010 20:03:40 -0500 X-ASG-Debug-ID: 1277859984-145200a50000-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 872EB1574B67 for ; Tue, 29 Jun 2010 18:06:25 -0700 (PDT) Received: from mail.internode.on.net (bld-mail15.adl6.internode.on.net [150.101.137.100]) by cuda.sgi.com with ESMTP id USTMjGcUYSrRAIIn for ; Tue, 29 Jun 2010 18:06:25 -0700 (PDT) Received: from dastard (unverified [121.44.238.155]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 18132966-1927428 for multiple; Wed, 30 Jun 2010 10:36:24 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OTlks-0006XS-57; Wed, 30 Jun 2010 11:06:22 +1000 Date: Wed, 30 Jun 2010 11:06:22 +1000 From: Dave Chinner To: "Linda A. Walsh" Cc: xfs-oss X-ASG-Orig-Subj: Re: xfs file system in process of becoming corrupt; though xfs_repair thinks it's fine! ;-/ (was xfs_dump problem...) Subject: Re: xfs file system in process of becoming corrupt; though xfs_repair thinks it's fine! ;-/ (was xfs_dump problem...) Message-ID: <20100630010622.GC24712@dastard> References: <4C26A51F.8020909@tlinx.org> <20100628022744.GX6590@dastard> <4C2A749E.4060006@tlinx.org> <20100629232532.GA24712@dastard> <4C2A8948.3030008@tlinx.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <4C2A8948.3030008@tlinx.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: 1277859986 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33949 Rule breakdown below pts rule 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 29, 2010 at 05:01:12PM -0700, Linda A. Walsh wrote: > > > Dave Chinner wrote: > --------------------------------------------------------------------------------------------------- > >>Ishtar:/Torrents> 'ls' -ni bad* ls: cannot access bad/30-Omoide > >>to Yakusoku (TV saizu|Reinaʼs Ver.).mp3: No such file or directory > >>ls: cannot access bad/31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3: No such file or directory > >>ls: cannot access bad/32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3: No such file or directory > >>bad: > >>total 0 > >>2359101 ?????????? ? ? ? ? ? 30-Omoide to Yakusoku (TV saizu|Reinaʼs Ver.).mp3 > >>2354946 ?????????? ? ? ? ? ? 31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3 > >>2354949 ?????????? ? ? ? ? ? 32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3 > >>ls: cannot access bad2/30-Omoide to Yakusoku (TV saizu|Reinaʼs Ver.).mp3: No such file or directory > >>ls: cannot access bad2/31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3: No such file or directory > >>ls: cannot access bad2/32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3: No such file or directory > > > >Those file names have a weird character in them - are you sure that > >the terminal supports that character set and is not mangling it and > >hence not matching what is actually stored on disk? > ----- > Those files were 'fine' before today. > > I know it is not a terminal problem -- > I told ls to list all files in the directory -- then it says "no such file". > > Can you say that "*" shouldn't match everything? > > Those question marks are in the place for the size! > > There are no weird characters in those file names. I beg to differ ;) > Here are the same files in another directory: > mp3> ll 3* > -rwx------ 1 3255702 2010-06-14 10:54 30-Omoide to Yakusoku (TV saizu|Reinaʼs Ver.).mp3* > -rwx------ 1 3272004 2010-06-14 10:54 31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3* > -rwx------ 1 3234876 2010-06-14 10:54 32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3* ^^^ That character is a non-ascii character, which is why I was wondering about terminals and character sets. It does not display correctly in mutt (a bold vertical bar) or Vim (a dotted, double character width square) using LANG=en_AU.UTF-8 here.... > The fields it can't display are the file size, time and dates! Yes, I know. To stat a file to get that infomration first you have to open it and that requires getting the file name exactly right. If you try to open a file encoded with one language setting/character set and then decode and re-encode it with another, the raw filename data will be different to what is on disk. Hence when I see filenames with unprintable characters in the mail, it's always worth checking first... > How can file size, time and date be in unprintable characters that "ls" can't display? They aren't. They are printed as ??? because the stat failed and hence they are unknown. Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0++WWN+30+fromorbit.com=david@internode.on.net Tue Jun 29 20:14: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 o5U1E5fp100694 for ; Tue, 29 Jun 2010 20:14:05 -0500 X-ASG-Debug-ID: 1277860610-1b2903a70000-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 D2B33419722 for ; Tue, 29 Jun 2010 18:16:50 -0700 (PDT) Received: from mail.internode.on.net (bld-mail14.adl6.internode.on.net [150.101.137.99]) by cuda.sgi.com with ESMTP id THPkRHw1LSkjsZMO for ; Tue, 29 Jun 2010 18:16:50 -0700 (PDT) Received: from dastard (unverified [121.44.238.155]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 30027875-1927428 for multiple; Wed, 30 Jun 2010 10:46:49 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OTlux-0006Yk-Gp; Wed, 30 Jun 2010 11:16:47 +1000 Date: Wed, 30 Jun 2010 11:16:47 +1000 From: Dave Chinner To: "Linda A. Walsh" Cc: Michael Weissenbacher , xfs-oss X-ASG-Orig-Subj: Re: xfs file system in process of becoming corrupt; though xfs_repair thinks it's fine! ; -/ (was xfs_dump problem...) Subject: Re: xfs file system in process of becoming corrupt; though xfs_repair thinks it's fine! ; -/ (was xfs_dump problem...) Message-ID: <20100630011647.GD24712@dastard> References: <4C26A51F.8020909@tlinx.org> <20100628022744.GX6590@dastard> <4C2A749E.4060006@tlinx.org> <20100629232532.GA24712@dastard> <4C2A87FF.7090804@dermichi.com> <4C2A92DA.1020202@tlinx.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C2A92DA.1020202@tlinx.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: 1277860611 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.33949 Rule breakdown below pts rule 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 29, 2010 at 05:42:02PM -0700, Linda A. Walsh wrote: > Do I need >32 bit inodes if the filesystem size is > 2T? No. inode64 is recommended for multi-terabyte filesystems, but is not mandatory. Cheers, Dave. -- Dave Chinner david@fromorbit.com From xfs@tlinx.org Tue Jun 29 20:50:10 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5U1o97Q101985 for ; Tue, 29 Jun 2010 20:50:09 -0500 X-ASG-Debug-ID: 1277862774-2ec701100000-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 31DDC1574BA1 for ; Tue, 29 Jun 2010 18:52:54 -0700 (PDT) Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id teZ8SibGxTmdk8Ht for ; Tue, 29 Jun 2010 18:52: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 o5U1ql5I013999; Tue, 29 Jun 2010 18:52:49 -0700 Message-ID: <4C2AA36F.2070905@tlinx.org> Date: Tue, 29 Jun 2010 18:52:47 -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: Dave Chinner CC: xfs-oss X-ASG-Orig-Subj: Re: xfs file system in process of becoming corrupt; though xfs_repair thinks it's fine! ;-/ (was xfs_dump problem...) Subject: Re: xfs file system in process of becoming corrupt; though xfs_repair thinks it's fine! ;-/ (was xfs_dump problem...) References: <4C26A51F.8020909@tlinx.org> <20100628022744.GX6590@dastard> <4C2A749E.4060006@tlinx.org> <20100629232532.GA24712@dastard> <4C2A8948.3030008@tlinx.org> <20100630010622.GC24712@dastard> In-Reply-To: <20100630010622.GC24712@dastard> X-Stationery: 0.5.1 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1277862775 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33953 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dave Chinner wrote: > On Tue, Jun 29, 2010 at 05:01:12PM -0700, Linda A. Walsh wrote: >> >> Dave Chinner wrote: >> --------------------------------------------------------------------------------------------------- >>>> Ishtar:/Torrents> 'ls' -ni bad* ls: cannot access bad/30-Omoide >>>> to Yakusoku (TV saizu|Reinaʼs Ver.).mp3: No such file or directory >>>> ls: cannot access bad/31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3: No such file or directory >>>> ls: cannot access bad/32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3: No such file or directory >>>> bad: >>>> total 0 >>>> 2359101 ?????????? ? ? ? ? ? 30-Omoide to Yakusoku (TV saizu|Reinaʼs Ver.).mp3 >>>> 2354946 ?????????? ? ? ? ? ? 31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3 >>>> 2354949 ?????????? ? ? ? ? ? 32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3 >>>> ls: cannot access bad2/30-Omoide to Yakusoku (TV saizu|Reinaʼs Ver.).mp3: No such file or directory >>>> ls: cannot access bad2/31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3: No such file or directory >>>> ls: cannot access bad2/32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3: No such file or directory >>> Those file names have a weird character in them - are you sure that >>> the terminal supports that character set and is not mangling it and >>> hence not matching what is actually stored on disk? >> ----- >> Those files were 'fine' before today. >> >> I know it is not a terminal problem -- >> I told ls to list all files in the directory -- then it says "no such file". >> >> Can you say that "*" shouldn't match everything? >> >> Those question marks are in the place for the size! >> >> There are no weird characters in those file names. > > I beg to differ ;) ---- They are standard UTF-8 characters! What's weird about them?!? Next you'll be complaining about my hair style... ;). > >> Here are the same files in another directory: >> mp3> ll 3* >> -rwx------ 1 3255702 2010-06-14 10:54 30-Omoide to Yakusoku (TV saizu|Reinaʼs Ver.).mp3* >> -rwx------ 1 3272004 2010-06-14 10:54 31-Omoide to Yakusoku (TV saizu|Tomoeʼs Ver.).mp3* >> -rwx------ 1 3234876 2010-06-14 10:54 32-Omoide to Yakusoku (TV saizu|Nanualʼs Ver.).mp3* > ^^^ > That character is a non-ascii character, which is why I was > wondering about terminals and character sets. It does not display > correctly in mutt (a bold vertical bar) or Vim (a dotted, double > character width square) using LANG=en_AU.UTF-8 here.... ---- you don't have the right font for your Vim. :-) I use vim here and it displays in the TTY version, the X version and even the windows version! Anyway -- as you can see above, the files display fine in another directory with the same character. IT's not the vertical bar char. I use UTF-8 characters all over the place -- I created that file manually. Go get 'Bablemap'. It's free (well donation requested) from http://www.babelstone.co.uk/Software/BabelMap.html. My systems handle them 'fine'. That's not the problem here. I have 3 directories that all have copies of files 30-32 in them that are corrupt. I have another directory "Shakugan no Shana II OST", that I can't cd into or ls. Just says 'not found'. This all happened today. They were accessible before today. I'm not sure what changed, other than new files were added. > >> How can file size, time and date be in unprintable characters that "ls" can't display? > > They aren't. They are printed as ??? because the stat failed and > hence they are unknown. ---- Ok, why would the stat fail? There's nothing magical about a 2TB limit? (sigh...) Ideas? Linda From xfs@tlinx.org Tue Jun 29 21:42:38 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.9 required=5.0 tests=BAYES_50,J_CHICKENPOX_45 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5U2gcvr104099 for ; Tue, 29 Jun 2010 21:42:38 -0500 X-ASG-Debug-ID: 1277865923-25f100a40000-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 4AFB1417719 for ; Tue, 29 Jun 2010 19:45:23 -0700 (PDT) Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id Cw9PoKM3bDGEDiGt for ; Tue, 29 Jun 2010 19:45:23 -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 o5U2jKkr015444 for ; Tue, 29 Jun 2010 19:45:23 -0700 Message-ID: <4C2AAFC1.9080708@tlinx.org> Date: Tue, 29 Jun 2010 19:45:21 -0700 From: "Linda A. Walsh" User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: Re: xfs file system in process of becoming corrupt; though xfs_repair thinks it's fine! ; -/ (was xfs_dump problem...) Subject: Re: xfs file system in process of becoming corrupt; though xfs_repair thinks it's fine! ; -/ (was xfs_dump problem...) References: <4C26A51F.8020909@tlinx.org> <20100628022744.GX6590@dastard> <4C2A749E.4060006@tlinx.org> <20100629232532.GA24712@dastard> <4C2A87FF.7090804@dermichi.com> <4C2A92DA.1020202@tlinx.org> <20100630011647.GD24712@dastard> In-Reply-To: <20100630011647.GD24712@dastard> X-Stationery: 0.5.1 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1277865924 X-Barracuda-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.33955 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 To make matters more interesting -- xfsdump can't access a couple of files and a directory or two. It thinks they are 'stale NFS handles' (I'm not running any NFS file systems). in @ 0.0 kB/s, out @ 0.0 kB/s, 0.0 kB total, buffer 0% fullxfsdump: WARNING: unable to open directory: ino 2082342: Stale NFS file handle xfsdump: WARNING: unable to open directory: ino 2082343: Stale NFS file handle in @ 4079 kB/s, out @ 4079 kB/s, 2040 kB total, buffer 0% fullxfsdump: dumping non-directory files in @ 68.0 MB/s, out @ 68.0 MB/s, 1209 GB total, buffer 0% fullll in @ 107 MB/s, out @ 105 MB/s, 2200 GB total, buffer 0% fullxfsdump: ending media file xfsdump: media file size 2362017678616 bytes xfsdump: dump size (non-dir files) : 2361953613176 bytes xfsdump: dump complete: 10926 seconds elapsed xfsdump: Dump Status: SUCCESS Running xfs_db on the file system (finished dumping) a block get returns: dir 1133368 block 0 extra leaf entry 5438b33d 79 dir 1133368 block 0 extra leaf entry 6624beba 71 dir 1133368 block 0 extra leaf entry 6d832f88 69 dir 1133368 block 0 extra leaf entry e6279e2d 80 dir ino 1133368 missing leaf entry for e627de2d/80 dir ino 1133368 missing leaf entry for 7624beba/71 dir ino 1133368 missing leaf entry for 5418b33d/79 dir ino 1133368 missing leaf entry for 6d832f80/69 dir 1134347 block 0 extra leaf entry 3907754f 4e dir 1134347 block 0 extra leaf entry 3cae5257 47 dir 1134347 block 0 extra leaf entry 6e3a4cfb 40 dir ino 1134347 missing leaf entry for 6e38ccfb/40 dir ino 1134347 missing leaf entry for 3905f54f/4e dir ino 1134347 missing leaf entry for 3cacd257/47 dir 1149453 block 0 extra leaf entry 190f789f 7d dir ino 1149453 missing leaf entry for 190b78df/7d dir 1193988 block 0 extra leaf entry 8f2b7b0c 80 dir ino 1193988 missing leaf entry for 8d2b7b0c/80 dir 2098474 block 0 extra leaf entry 891d210e b5 dir ino 2098474 missing leaf entry for 891d200f/b5 dir 2103050 block 0 extra leaf entry 3c8b96be 79 dir ino 2103050 missing leaf entry for 3c8b96ae/79 dir 2106377 block 0 extra leaf entry 6554830e 185 dir 2106377 block 0 extra leaf entry 8265fcda 173 dir 2106377 block 0 extra leaf entry b251fcda 17f dir 2106377 block 0 extra leaf entry b687730b 179 dir ino 2106377 missing leaf entry for 8265fcd2/173 dir ino 2106377 missing leaf entry for b251fcd2/17f dir ino 2106377 missing leaf entry for b687734b/179 dir ino 2106377 missing leaf entry for 6554c31e/185 dir 2107395 block 0 extra leaf entry 207fea65 ff dir 2107395 block 0 extra leaf entry dd1d75a2 f8 dir ino 2107395 missing leaf entry for df1d75a2/f8 dir ino 2107395 missing leaf entry for 206fea65/ff dir 2215937 block 0 extra leaf entry 1d5bcd6d 3a dir 2215937 block 0 extra leaf entry 9c82da3c 9c dir 2215937 block 0 extra leaf entry ff88d238 a4 dir ino 2215937 missing leaf entry for 1f5bcd6d/3a dir ino 2215937 missing leaf entry for fd88d238/a4 dir ino 2215937 missing leaf entry for 9e82da3c/9c dir 2218278 block 0 extra leaf entry 1d5bcd6d 3a dir 2218278 block 0 extra leaf entry 9c82da3c 9c dir 2218278 block 0 extra leaf entry ff88d238 a4 dir ino 2218278 missing leaf entry for 1f5bcd6d/3a dir ino 2218278 missing leaf entry for fd88d238/a4 dir ino 2218278 missing leaf entry for 9e82da3c/9c dir 2241309 block 0 extra leaf entry 51ae209 39 dir 2241309 block 0 extra leaf entry b5c3baca 32 dir ino 2241309 missing leaf entry for 5186209/39 dir ino 2241309 missing leaf entry for b5c13aca/32 dir 2291983 block 0 extra leaf entry 16650e73 117 dir 2291983 block 0 extra leaf entry 355a317c 112 dir 2291983 block 0 extra leaf entry 47464246 ee dir 2291983 block 0 extra leaf entry 620ec6fb 109 dir 2291983 block 0 extra leaf entry 62170366 e7 dir 2291983 block 0 extra leaf entry 73c17bba 10d dir 2291983 block 0 extra leaf entry 747a8790 e2 dir 2291983 block 0 extra leaf entry 894504e3 ff dir 2291983 block 0 extra leaf entry b17d4203 11c dir 2291983 block 0 extra leaf entry d12c165b 105 dir 2291983 block 0 extra leaf entry d33f483d fb dir 2291983 block 0 extra leaf entry e28ebb3b f2 dir 2291983 block 0 extra leaf entry f9f9b6d1 f6 dir ino 2291983 missing leaf entry for 8b4504e3/ff dir ino 2291983 missing leaf entry for d33f48ad/fb dir ino 2291983 missing leaf entry for 375a317c/112 dir ino 2291983 missing leaf entry for e9f9bed1/f6 dir ino 2291983 missing leaf entry for 45464246/ee dir ino 2291983 missing leaf entry for 71c17bba/10d dir ino 2291983 missing leaf entry for b13d4203/11c dir ino 2291983 missing leaf entry for 745a8790/e2 dir ino 2291983 missing leaf entry for 16650e63/117 dir ino 2291983 missing leaf entry for e21f0366/e7 dir ino 2291983 missing leaf entry for e08ebb2b/f2 dir ino 2291983 missing leaf entry for d12896db/105 dir ino 2291983 missing leaf entry for 620ec6eb/109 xfs_repair -n now shows: Phase 1 - find and verify superblock... Phase 2 - using internal log - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan (but don't clear) agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - agno = 4 - agno = 5 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 2 - agno = 1 - agno = 0 - agno = 5 - agno = 4 - agno = 3 No modify flag set, skipping phase 5 Phase 6 - check inode connectivity... - traversing filesystem ... entry "10 Otome ha DO MY BEST desho¿ (off vocal).flac" (ino 2359102) in dir 1133368 is a duplicate name, would junk entry entry "06 Otome ha DO MY BEST desho¿ Otome ver..flac" (ino 2359100) in dir 1133368 is a duplicate name, would junk entry entry "05 Otome ha DO MY BEST desho¿ Hime ver..flac" (ino 2359099) in dir 1133368 is a duplicate name, would junk entry entry "04 Otome ha DO MY BEST desho¿ 2007ver..flac" (ino 2359086) in dir 1133368 is a duplicate name, would junk entry entry "04 Finality blue «instrumental».flac" (ino 2220801) in dir 1134347 is a duplicate name, would junk entry entry "06 Koko ni Atta ne «instrumental».flac" (ino 2220800) in dir 1134347 is a duplicate name, would junk entry entry "05 Heart All Green «instrumental».flac" (ino 2359103) in dir 1134347 is a duplicate name, would junk entry entry "01_Tenkai Hen Josô e no Zensô Kyoku.mp3" (ino 2359093) in dir 1149453 is a duplicate name, would junk entry entry "01 Träumerei.flac" (ino 2359098) in dir 1193988 is a duplicate name, would junk entry entry "16 - Pretty Guardian Sailor Moon - Kiss!² Bang!².ogg" (ino 2359097) in dir 2098474 is a duplicate name, would junk entry entry "03 Broken MÖBIUS.ogg" (ino 2359094) in dir 2103050 is a duplicate name, would junk entry entry "14 - Broken MÖBIUS Henkei A.ogg" (ino 2359095) in dir 2106377 is a duplicate name, would junk entry entry "27 - Shin·Henshin Sailormoon.ogg" (ino 2359092) in dir 2106377 is a duplicate name, would junk entry entry "19 - Broken MÖBIUS Henkei B.ogg" (ino 2359088) in dir 2106377 is a duplicate name, would junk entry entry "06 - GURU·GURU·GURA.ogg" (ino 2359089) in dir 2106377 is a duplicate name, would junk entry entry "35 Ankoku no Uranai Noshi · Lilith.ogg" (ino 2359091) in dir 2107395 is a duplicate name, would junk entry entry "17 Kaguya Shima·Mukashi Mono Gatarii.ogg" (ino 2359087) in dir 2107395 is a duplicate name, would junk entry bad hash table for directory inode 2215937 (hash value mismatch): would rebuild bad hash table for directory inode 2218278 (hash value mismatch): would rebuild entry "03 Free and Dream «Instrumental».flac" (ino 2359090) in dir 2241309 is a duplicate name, would junk entry entry "04 Asu he -Sorairo no Tegami- «Instrumental».flac" (ino 2359096) in dir 2241309 is a duplicate name, would junk entry entry "18 Rafraîchissement.flac" (ino 2359085) in dir 2291983 is a duplicate name, would junk entry entry "17 Différent malgré la ressemblance.flac" (ino 2218273) in dir 2291983 is a duplicate name, would junk entry entry "09 Sincèrement.flac" (ino 2218271) in dir 2291983 is a duplicate name, would junk entry entry "15 Déjà Vu.flac" (ino 2218276) in dir 2291983 is a duplicate name, would junk entry entry "20 Fête d'école.flac" (ino 2218275) in dir 2291983 is a duplicate name, would junk entry entry "12 Péripétie.flac" (ino 2218270) in dir 2291983 is a duplicate name, would junk entry entry "27 Lieu de la bataille décisive.flac" (ino 2218272) in dir 2291983 is a duplicate name, would junk entry entry "06 Sérénité.flac" (ino 2218274) in dir 2291983 is a duplicate name, would junk entry entry "04 Tragédie.flac" (ino 2218266) in dir 2291983 is a duplicate name, would junk entry entry "25 Serment éternel.flac" (ino 2218268) in dir 2291983 is a duplicate name, would junk entry entry "16 Force étrange.flac" (ino 2218277) in dir 2291983 is a duplicate name, would junk entry entry "28 Manoeuvres secrètes.flac" (ino 2218269) in dir 2291983 is a duplicate name, would junk entry entry "26 Jours passés.flac" (ino 2218267) in dir 2291983 is a duplicate name, would junk entry - traversal finished ... - moving disconnected inodes to lost+found ... disconnected inode 2218266, would move to lost+found disconnected inode 2218267, would move to lost+found disconnected inode 2218268, would move to lost+found disconnected inode 2218269, would move to lost+found disconnected inode 2218270, would move to lost+found disconnected inode 2218271, would move to lost+found disconnected inode 2218272, would move to lost+found disconnected inode 2218273, would move to lost+found disconnected inode 2218274, would move to lost+found disconnected inode 2218275, would move to lost+found disconnected inode 2218276, would move to lost+found disconnected inode 2218277, would move to lost+found disconnected inode 2220800, would move to lost+found disconnected inode 2220801, would move to lost+found disconnected inode 2359085, would move to lost+found disconnected inode 2359086, would move to lost+found disconnected inode 2359087, would move to lost+found disconnected inode 2359088, would move to lost+found disconnected inode 2359089, would move to lost+found disconnected inode 2359090, would move to lost+found disconnected inode 2359091, would move to lost+found disconnected inode 2359092, would move to lost+found disconnected inode 2359093, would move to lost+found disconnected inode 2359094, would move to lost+found disconnected inode 2359095, would move to lost+found disconnected inode 2359096, would move to lost+found disconnected inode 2359097, would move to lost+found disconnected inode 2359098, would move to lost+found disconnected inode 2359099, would move to lost+found disconnected inode 2359100, would move to lost+found disconnected inode 2359102, would move to lost+found disconnected inode 2359103, would move to lost+found Phase 7 - verify link counts... No modify flag set, skipping filesystem flush and exiting. ------------- This isn't going to help to repair it though -- I repaired it this morning and it showed up as fine! Then all of the above happened today! It would appear that 2.6.34 might have some problems in it? -linda From xfs@tlinx.org Wed Jun 30 07:23:24 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5UCNOMI128216 for ; Wed, 30 Jun 2010 07:23:24 -0500 X-ASG-Debug-ID: 1277900769-577c00390000-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 6987D1579A61 for ; Wed, 30 Jun 2010 05:26:09 -0700 (PDT) Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id IPeavgaLP5sR2K74 for ; Wed, 30 Jun 2010 05:26:09 -0700 (PDT) Received: from [192.168.3.12] (Athenae [192.168.3.12]) by Ishtar.sc.tlinx.org (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5UCPwr7010942 for ; Wed, 30 Jun 2010 05:26:00 -0700 Message-ID: <4C2B37D6.50801@tlinx.org> Date: Wed, 30 Jun 2010 05:25:58 -0700 From: "Linda A. Walsh" User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: When it rains it pours.... Subject: When it rains it pours.... 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: 1277900770 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0008 1.0000 -2.0159 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.33995 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Due to another bug in lvm, my restore of this partition crashed after running a few hours (takes alot longer to restore than to backup). So I decided to use the "-R" option to Resume my previously left off dump: # xfsrestore -R -p 180 -f /backups/Ishtar/torrents/torrents-100629-0-1611.dump . xfsrestore: using file dump (drive_simple) strategy xfsrestore: version 3.0.4 (dump format 3.0) - Running single-threaded xfsrestore: resuming restore previously begun Wed Jun 30 04:41:57 2010 xfsrestore: examining media file 0 xfsrestore: seeking past portion of media file already restored Looks good so far!..Yup, and.. xfsrestore: drive_simple.c:770: do_seek_mark: Assertion `nreadneeded64 <= ( ( intgen_t ) ( ( ( 1ull << ( ( unsigned long long )sizeof( intgen_t ) * ( unsigned long long )8 - ( 1ull + 1ull ))) - 1ull ) * 2ull + 1ull ))' failed. Aborted (core dumped) Say what? Um...is that supposed to be an error message? Why can't it just tell me why "'nreadneeded64' > 0xbfffffffffffffd" is 'bad', or what it means? I have a feeling that the 'core dumped' message means that if I want my filesystem restored in the near future, I should just restart... *sigh* -l From xfs@tlinx.org Wed Jun 30 11:18: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 o5UGISSk135722 for ; Wed, 30 Jun 2010 11:18:28 -0500 X-ASG-Debug-ID: 1277914873-0eea02970000-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 997E841BC02 for ; Wed, 30 Jun 2010 09:21:14 -0700 (PDT) Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id FKpx2AFxUOisv7wc for ; Wed, 30 Jun 2010 09:21:14 -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 o5UGL23k018089 for ; Wed, 30 Jun 2010 09:21:04 -0700 Message-ID: <4C2B6EEE.5050103@tlinx.org> Date: Wed, 30 Jun 2010 09:21:02 -0700 From: "Linda A. Walsh" User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: xfs_restore -R -- recovering a previous restore...does it work? Subject: xfs_restore -R -- recovering a previous restore...does it work? References: <4C2B37D6.50801@tlinx.org> In-Reply-To: <4C2B37D6.50801@tlinx.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: 1277914874 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.34011 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean So why is this crashing? I just had it happen again -- something killed off the window it was executing in -- system didn't go down, but it got a hangup -- a cleaner shutdown -- but it still doesn't recover. Under what circumstances should this work? Or does it work? Linda A. Walsh wrote: > Due to another bug in lvm, my restore of this partition crashed after running a few > hours (takes alot longer to restore than to backup). > > So I decided to use the "-R" option to Resume my previously left off dump: > > # xfsrestore -R -p 180 -f /backups/Ishtar/torrents/torrents-100629-0-1611.dump . > xfsrestore: using file dump (drive_simple) strategy > xfsrestore: version 3.0.4 (dump format 3.0) - Running single-threaded > xfsrestore: resuming restore previously begun Wed Jun 30 04:41:57 2010 > xfsrestore: examining media file 0 > xfsrestore: seeking past portion of media file already restored > > Looks good so far!..Yup, and.. > > xfsrestore: drive_simple.c:770: do_seek_mark: Assertion `nreadneeded64 <= ( ( intgen_t ) ( ( ( 1ull << ( ( unsigned long long )sizeof( intgen_t ) * ( unsigned long long )8 - ( 1ull + 1ull ))) - 1ull ) * 2ull + 1ull ))' failed. > Aborted (core dumped) > > > Say what? Um...is that supposed to be an error message? > > Why can't it just tell me why "'nreadneeded64' > 0xbfffffffffffffd" > is 'bad', or what it means? > > I have a feeling that the 'core dumped' message means that > if I want my filesystem restored in the near future, I should > just restart... > > *sigh* > -l > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From xfs@tlinx.org Wed Jun 30 12:49: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 o5UHnMB1138852 for ; Wed, 30 Jun 2010 12:49:22 -0500 X-ASG-Debug-ID: 1277920623-41b302440000-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 681EE14B3C25 for ; Wed, 30 Jun 2010 10:57:04 -0700 (PDT) Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id RXuebcyXp6TlI9bz for ; Wed, 30 Jun 2010 10:57:04 -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 o5UHpxb4020203; Wed, 30 Jun 2010 10:52:02 -0700 Message-ID: <4C2B8440.5030503@tlinx.org> Date: Wed, 30 Jun 2010 10:52:00 -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: Chris Wedgwood CC: xfs-oss X-ASG-Orig-Subj: Re: xfs_restore -R -- recovering a previous restore...does it work? Subject: Re: xfs_restore -R -- recovering a previous restore...does it work? References: <4C2B37D6.50801@tlinx.org> <4C2B6EEE.5050103@tlinx.org> <20100630172750.GA20764@puku.stupidest.org> In-Reply-To: <20100630172750.GA20764@puku.stupidest.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: 1277920624 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.34016 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dmesg shows nothing revealing. I am not using tape -- I'm restoring from a file. Does it only work with tapes? I didn't recall it saying so. -l Chris Wedgwood wrote: > On Wed, Jun 30, 2010 at 09:21:02AM -0700, Linda A. Walsh wrote: > >> I just had it happen again -- something killed off the window it was >> executing in -- system didn't go down, but it got a hangup -- a >> cleaner shutdown -- but it still doesn't recover. > > dmesg ... > > see anything? > >> Under what circumstances should this work? Or does it work? > > it used to work for me, i've not tried it recently though, i basically > gave up tapes (and xfsdump/restore) some time back due to size/cost > contraints ---- Do you not keep backups at all anymore? Or if you do, do you not care about the metastuff? Only other backup util, that I know of, that speaks meta, is 'star'. From michael.monnerie@is.it-management.at Wed Jun 30 13:22: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.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_45 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5UIMcXw140231 for ; Wed, 30 Jun 2010 13:22:39 -0500 X-ASG-Debug-ID: 1277922617-419203250000-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 4249C15AC0F7 for ; Wed, 30 Jun 2010 11:30:18 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id ln8mCjJFzGsvnzhZ for ; Wed, 30 Jun 2010 11:30:18 -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 37B65705 for ; Wed, 30 Jun 2010 20:25:21 +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 1466083C821 for ; Wed, 30 Jun 2010 20:24:50 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs file system in process of becoming corrupt; though xfs_repair thinks it's fine! ; -/ (was xfs_dump problem...) Subject: Re: xfs file system in process of becoming corrupt; though xfs_repair thinks it's fine! ; -/ (was xfs_dump problem...) Date: Wed, 30 Jun 2010 20:25:20 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.31.12-0.2-desktop; KDE/4.3.5; x86_64; ; ) References: <4C26A51F.8020909@tlinx.org> <20100628022744.GX6590@dastard> <4C2A749E.4060006@tlinx.org> In-Reply-To: <4C2A749E.4060006@tlinx.org> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart4264842.0mvYMLhAeJ"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201006302025.20289@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1277922619 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.34018 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart4264842.0mvYMLhAeJ Content-Type: multipart/mixed; boundary="Boundary-01=_Qw4KMswcb0uhpR9" Content-Transfer-Encoding: 7bit --Boundary-01=_Qw4KMswcb0uhpR9 Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline On Mittwoch, 30. Juni 2010 Linda Walsh wrote: > But have another XFS problem that is much more reliably persistent. > I don't know if they are at all related, but since I have this > problem that's a bit "stuck", it's easier to "reproduce". =20 I think my problem is similar. I have a Linux ("orion") running Samba.=20 A Win7 client uses it to store it's "Windows Backup". That's OK. =46rom another Linux ("saturn"), I do an rsync via an rsync-module,=20 and have already 4 Versions where the ".vhd" file of that Windows Backup=20 is destroyed on "saturn". So the corruption happens when starting=20 rsync @saturn, copying orion->saturn, both having XFS. As I cannot delete the broken files, I moved the whole dir away,=20 and did an rsync again. The same file destroyed again on saturn. Some days later, again 2 versions which are destroyed. The difference to Linda is, I get: drwx------+ 2 zmi users 4096 Jun 12 03:15 ./ drwxr-xr-x 7 root root 154 Jun 30 04:00 ../ =2Drwx------+ 1 zmi users 56640000 Jun 12 03:05 852c268f-cf1a-11de-b09b-80= 6e6f6e6963.vhd* ??????????? ? ? ? ? ? 852c2690-cf1a-11de-b09b-806e= 6f6e6963.vhd=20 and on dmesg: [125903.343714] Filesystem "dm-0": corrupt inode 649642 ((a)extents =3D 5).= Unmount and run xfs_repair. = =20 [125903.343735] ffff88011e34ca00: 49 4e 81 c0 02 02 00 00 00 00 03 e8 00 00= 00 64 IN.............d = =20 [125903.343756] 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 0xffffffffa032c0ad [125903.343763] = = =20 [125903.343791] Pid: 17696, comm: ls Not tainted 2.6.31.12-0.2-desktop #1 = = =20 [125903.343803] Call Trace: = = =20 [125903.343821] [] try_stack_unwind+0x189/0x1b0 = = =20 [125903.343840] [] dump_trace+0xad/0x3a0 = = =20 [125903.343858] [] show_trace_log_lvl+0x64/0x90 = = =20 [125903.343876] [] show_trace+0x23/0x40 = = =20 [125903.343894] [] dump_stack+0x81/0x9e = = =20 [125903.343947] [] xfs_error_report+0x5a/0x70 [xfs] = = =20 [125903.344085] [] xfs_corruption_error+0x6c/0x90 [xfs] = = =20 [125903.344248] [] xfs_iformat_extents+0x234/0x280 [xfs]= = =20 [125903.344409] [] xfs_iformat+0x28d/0x5a0 [xfs] = = =20 [125903.344569] [] xfs_iread+0x182/0x1c0 [xfs] = = =20 [125903.344729] [] xfs_iget_cache_miss+0x78/0x250 [xfs] = = =20 [125903.344882] [] xfs_iget+0x12c/0x1b0 [xfs] = = =20 [125903.345036] [] xfs_lookup+0xce/0x100 [xfs] = = =20 [125903.345256] [] xfs_vn_lookup+0x6c/0xc0 [xfs] = = =20 [125903.345453] [] real_lookup+0x102/0x180 = = =20 [125903.345473] [] do_lookup+0xd0/0x100 = = =20 [125903.345491] [] __link_path_walk+0x522/0x880 = = =20 [125903.345510] [] path_walk+0x66/0xd0 = = =20 [125903.345528] [] do_path_lookup+0x6b/0xb0 = = =20 [125903.345546] [] user_path_at+0x61/0xc0 = = =20 [125903.345565] [] vfs_fstatat+0x41/0x90 = = =20 [125903.345584] [] vfs_lstat+0x2c/0x50 = = =20 [125903.345602] [] sys_newlstat+0x2e/0x70 = = =20 [125903.345621] [] system_call_fastpath+0x16/0x1b = = =20 [125903.345645] [<00007f72dc451e65>] 0x7f72dc451e65 Trying to "xfs_repair -n" seems to find errors, see attachment "repair1.log" Trying to "xfs_repair" crashes, see attachment "repair2.log" Saturns kernel is 2.6.31.12-0.2-desktop from openSUSE 11.2,=20 xfs_repair is 3.1.2 (I tried down several versions down to 3.0.1, all witho= ut success). Even after xfs_metadump and xfs_mdrestore the error exists, and cannot be=20 repaired with xfs_repair, because that crashes. I've put a new metadump containing only the broken stuff for public review: http://zmi.at/saturn_bigdata.metadump.only_broken.bz2 (197 MB) What should I do, apart of ripping the whole filesystem and copying new?=20 The problem is, would be destroyed again, just like it did 4 times now. =2D-=20 mit freundlichen Gr=C3=BCssen, Michael Monnerie, Ing. BSc it-management Internet Services http://proteger.at [gesprochen: Prot-e-schee] Tel: 0660 / 415 65 31 // Wir haben im Moment zwei H=C3=A4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --Boundary-01=_Qw4KMswcb0uhpR9 Content-Type: text/x-log; charset="UTF-8"; name="repair1.log" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="repair1.log" Phase 1 - find and verify superblock... Phase 2 - using internal log - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan (but don't clear) agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 would have corrected attribute entry count in inode 649642 from 40 to 0 local inode 649790 attr too small (size = 1, min size = 4) bad attribute fork in inode 649790, would clear attr fork would have cleared inode 649790 - agno = 1 local inode 2195133988 attr too small (size = 3, min size = 4) bad attribute fork in inode 2195133988, would clear attr fork would have cleared inode 2195133988 would have corrected attribute entry count in inode 2902971474 from 163 to 0 would have corrected attribute totsize in inode 2902971474 from 6 to 4 - 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 = 0 - agno = 1 - agno = 2 - agno = 3 - agno = 4 - agno = 5 - agno = 6 - agno = 7 local inode 2195133988 attr too small (size = 3, min size = 4) bad attribute fork in inode 2195133988, would clear attr fork would have cleared inode 2195133988 local inode 649790 attr too small (size = 1, min size = 4) bad attribute fork in inode 649790, would clear attr fork would have cleared inode 649790 No modify flag set, skipping phase 5 Phase 6 - check inode connectivity... - traversing filesystem ... - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify link counts... No modify flag set, skipping filesystem flush and exiting. --Boundary-01=_Qw4KMswcb0uhpR9 Content-Type: text/x-log; charset="UTF-8"; name="repair2.log" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="repair2.log" Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 corrected attribute entry count in inode 649642, was 40, now 0 problem with attribute contents in inode 649642 local inode 649790 attr too small (size = 1, min size = 4) bad attribute fork in inode 649790, clearing attr fork clearing inode 649790 attributes cleared inode 649790 - 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 corrected attribute entry count in inode 2902971474, was 163, now 0 corrected attribute entry totsize in inode 2902971474, was 6, now 4 problem with attribute contents in inode 2902971474 - 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 = 0 - agno = 1 - agno = 2 - agno = 3 - agno = 4 - agno = 5 - agno = 6 - agno = 7 data fork in inode 2195133988 claims metadata block 537122652 xfs_repair: dinode.c:2101: process_inode_data_fork: Assertion `err == 0' failed. --Boundary-01=_Qw4KMswcb0uhpR9-- --nextPart4264842.0mvYMLhAeJ 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) iEYEABECAAYFAkwrjBAACgkQzhSR9xwSCbQD4wCg1Sb8U2bXbSKLpL1nbnD2+fnl z3AAn0fNE4ZB5Wf8ssSMrxj1zGTnGsEj =vT9G -----END PGP SIGNATURE----- --nextPart4264842.0mvYMLhAeJ-- From xfs@tlinx.org Wed Jun 30 14:08:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5UJ85K8142157 for ; Wed, 30 Jun 2010 14:08:06 -0500 X-ASG-Debug-ID: 1277925051-3fab018d0000-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 6C53D1D62D48 for ; Wed, 30 Jun 2010 12:10:51 -0700 (PDT) Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id b85jZ8HZx2TqaQyt for ; Wed, 30 Jun 2010 12:10:51 -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 o5UJAaE5021946; Wed, 30 Jun 2010 12:10:38 -0700 Message-ID: <4C2B96AC.4030009@tlinx.org> Date: Wed, 30 Jun 2010 12:10:36 -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: Chris Wedgwood , xfs-oss X-ASG-Orig-Subj: Re: xfs_restore -R -- recovering a previous restore...does it work? Subject: Re: xfs_restore -R -- recovering a previous restore...does it work? References: <4C2B37D6.50801@tlinx.org> <4C2B6EEE.5050103@tlinx.org> <20100630172750.GA20764@puku.stupidest.org> <4C2B8440.5030503@tlinx.org> <20100630182755.GA23188@puku.stupidest.org> In-Reply-To: <20100630182755.GA23188@puku.stupidest.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: 1277925052 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.34020 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Chris Wedgwood wrote: > On Wed, Jun 30, 2010 at 10:52:00AM -0700, Linda A. Walsh wrote: > >> Dmesg shows nothing revealing. > > it seems odd the subprocess killed you terminal then ---- No...it was attached to a terminal window that got closed by accident. > >> I am not using tape -- I'm restoring from a file. >> >> Does it only work with tapes? I didn't recall it saying so. > > files should work, i've just not used them personally aside from some > testing > > > how large is the image to be restored? A few bytes... 2362017678616 ( 2.15TB) From stan@hardwarefreak.com Wed Jun 30 15:59:13 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5UKxC5x146959 for ; Wed, 30 Jun 2010 15:59:13 -0500 X-ASG-Debug-ID: 1277931717-5b2d004e0000-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 388C4157E3A9 for ; Wed, 30 Jun 2010 14:01:57 -0700 (PDT) Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id ZIcnKAadVF3bVoyi for ; Wed, 30 Jun 2010 14:01:57 -0700 (PDT) Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 58B286C3F6 for ; Wed, 30 Jun 2010 16:01:57 -0500 (CDT) Message-ID: <4C2BB0C4.4060800@hardwarefreak.com> Date: Wed, 30 Jun 2010 16:01:56 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.1.10) Gecko/20100512 Thunderbird/3.0.5 MIME-Version: 1.0 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs file system in process of becoming corrupt; though xfs_repair thinks it's fine! ; -/ (was xfs_dump problem...) Subject: Re: xfs file system in process of becoming corrupt; though xfs_repair thinks it's fine! ; -/ (was xfs_dump problem...) References: <4C26A51F.8020909@tlinx.org> <20100628022744.GX6590@dastard> <4C2A749E.4060006@tlinx.org> <20100629232532.GA24712@dastard> <4C2A8948.3030008@tlinx.org> <20100630010622.GC24712@dastard> <4C2AA36F.2070905@tlinx.org> In-Reply-To: <4C2AA36F.2070905@tlinx.org> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1277931718 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: -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.34020 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 Linda A. Walsh put forth on 6/29/2010 8:52 PM: > I have another directory "Shakugan no Shana II OST", that I can't cd > into or ls. > Just says 'not found'. > > This all happened today. They were accessible before today. I'm not > sure what changed, > other than new files were added. It is interesting that all of these "corrupt" files originate from Japan. The filenames have likely passed through many different character encodings on their journey from their source to your XFS filesystems. And they probably originated on a MS Windows machine. How can you be so certain that there isn't a wonky bit somewhere that's wreaking havoc with BabelMap? Maybe that program has a bug, that after after Y access cycles flips a bit, changes a character, or something along these lines? Did you update this program recently, or any other programs that might affect character encoding/displaying, or anything remotely related to such? Have you done any software updates recently, period? Given the entirety of what we're looking at, and that you're apparently not seeing this with files created in a native English language encoding, I'd say Dave is probably on the right track here. -- Stan From SRS0++WWN+30+fromorbit.com=david@internode.on.net Wed Jun 30 18:27: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 o5UNRnBQ154405 for ; Wed, 30 Jun 2010 18:27:49 -0500 X-ASG-Debug-ID: 1277940633-57ad02940000-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 1A0E7158190F for ; Wed, 30 Jun 2010 16:30:33 -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 fjOpeLzrocDO2bcp for ; Wed, 30 Jun 2010 16:30:33 -0700 (PDT) Received: from dastard (unverified [121.44.238.155]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 29817682-1927428 for multiple; Thu, 01 Jul 2010 09:00:31 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OU6jd-0007yf-Qe; Thu, 01 Jul 2010 09:30:29 +1000 Date: Thu, 1 Jul 2010 09:30:29 +1000 From: Dave Chinner To: Michael Monnerie Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: rsync and corrupt inodes (was xfs_dump problem) Subject: rsync and corrupt inodes (was xfs_dump problem) Message-ID: <20100630233029.GO24712@dastard> References: <4C26A51F.8020909@tlinx.org> <20100628022744.GX6590@dastard> <4C2A749E.4060006@tlinx.org> <201006302025.20289@zmi.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201006302025.20289@zmi.at> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: bld-mail16.adl2.internode.on.net[150.101.137.101] X-Barracuda-Start-Time: 1277940635 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.34020 Rule breakdown below pts rule 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 30, 2010 at 08:25:20PM +0200, Michael Monnerie wrote: > On Mittwoch, 30. Juni 2010 Linda Walsh wrote: > > But have another XFS problem that is much more reliably persistent. > > I don't know if they are at all related, but since I have this > > problem that's a bit "stuck", it's easier to "reproduce". > > I think my problem is similar. I have a Linux ("orion") running Samba. > A Win7 client uses it to store it's "Windows Backup". That's OK. > > From another Linux ("saturn"), I do an rsync via an rsync-module, > and have already 4 Versions where the ".vhd" file of that Windows Backup > is destroyed on "saturn". So the corruption happens when starting > rsync @saturn, copying orion->saturn, both having XFS. Are you running rsync locally on saturn (i.e. pulling data)? If so, can you get an strace of the rsync of that file so we can see what the order or operations being done on the file is. If you are pushing data to saturn, does the problem go away if you pull it (and vice versa)? > As I cannot delete the broken files, I moved the whole dir away, > and did an rsync again. The same file destroyed again on saturn. > Some days later, again 2 versions which are destroyed. > > The difference to Linda is, I get: > drwx------+ 2 zmi users 4096 Jun 12 03:15 ./ > drwxr-xr-x 7 root root 154 Jun 30 04:00 ../ > -rwx------+ 1 zmi users 56640000 Jun 12 03:05 852c268f-cf1a-11de-b09b-806e6f6e6963.vhd* > ??????????? ? ? ? ? ? 852c2690-cf1a-11de-b09b-806e6f6e6963.vhd On the source machine, can you get a list of the xattrs on the inode? > and on dmesg: > [125903.343714] Filesystem "dm-0": corrupt inode 649642 ((a)extents = 5). Unmount and run xfs_repair. > [125903.343735] ffff88011e34ca00: 49 4e 81 c0 02 02 00 00 00 00 03 e8 00 00 00 64 IN.............d > [125903.343756] 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/linux-2.6.31/fs/xfs/xfs_inode.c. Caller 0xffffffffa032c0ad That seems like a different problem to what linda is seeing because this is on-disk corruption. can you dump the bad inode via: # xfs_db -x -r -c "inode 649642" -c p > [125903.343791] Pid: 17696, comm: ls Not tainted 2.6.31.12-0.2-desktop #1 That's getting a bit old now. This kernel does not have any of the swap extent guards we added to avoid fsr corrupting inodes with attribute forks, and the above corruption report and the repair output look exactly like I saw when intentionally corrupting inodes with xfs_fsr. > Trying to "xfs_repair -n" seems to find errors, see attachment "repair1.log" Hmmmm - do you run xfs_fsr? The errors reported and the corrutpion above are exactly what I'd expect from the swap extent bugs we fixed a while back.... > Trying to "xfs_repair" crashes, see attachment "repair2.log" > > Saturns kernel is 2.6.31.12-0.2-desktop from openSUSE 11.2, > xfs_repair is 3.1.2 (I tried down several versions down to 3.0.1, all without success). > > Even after xfs_metadump and xfs_mdrestore the error exists, and cannot be > repaired with xfs_repair, because that crashes. > > I've put a new metadump containing only the broken stuff for public review: > http://zmi.at/saturn_bigdata.metadump.only_broken.bz2 (197 MB) I'll take a look. Cheers, Dave. -- Dave Chinner david@fromorbit.com From xfs@tlinx.org Wed Jun 30 19:03:58 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o6103wZX156031 for ; Wed, 30 Jun 2010 19:03:58 -0500 X-ASG-Debug-ID: 1277942803-29c8032f0000-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 E502341DF6E for ; Wed, 30 Jun 2010 17:06:44 -0700 (PDT) Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id NCEBrI01LII3yB5o for ; Wed, 30 Jun 2010 17:06:44 -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 o6106MrM030627; Wed, 30 Jun 2010 17:06:25 -0700 Message-ID: <4C2BDBFE.5050007@tlinx.org> Date: Wed, 30 Jun 2010 17:06:22 -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: Chris Wedgwood , xfs-oss X-ASG-Orig-Subj: Re: xfs_restore -R -- recovering a previous restore...does it work? Subject: Re: xfs_restore -R -- recovering a previous restore...does it work? References: <4C2B37D6.50801@tlinx.org> <4C2B6EEE.5050103@tlinx.org> <20100630172750.GA20764@puku.stupidest.org> <4C2B8440.5030503@tlinx.org> <20100630182755.GA23188@puku.stupidest.org> <4C2B96AC.4030009@tlinx.org> <20100630213653.GA26145@puku.stupidest.org> In-Reply-To: <20100630213653.GA26145@puku.stupidest.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: 1277942804 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.34020 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Chris Wedgwood wrote: >>> how large is the image to be restored? >> ( 2.15TB) > out of interest, so smaller images work? I don't know...this was my first time I ever tried it. Usually smaller images don't have so many opportunities to get interrupted. :-) This one took 3h 18m, .. a crappy 189MB/s! I was just unlucky enough to have something interrupt it 3 times in a row (since it was the partition that was corrupt -- I'm a bit scattered as I have no idea what might have caused that partition to go corrupt and no idea if it is just going turn around and happen again. Unfortunately, it's not like it is the easiest partition to backup & restore. Guess I can experiment! ;-) From SRS0+5f+1+31+fromorbit.com=david@internode.on.net Wed Jun 30 19:21:42 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o610Lg0L156747 for ; Wed, 30 Jun 2010 19:21:42 -0500 X-ASG-Debug-ID: 1277944163-0d2e03620000-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 AF45814B426F for ; Wed, 30 Jun 2010 17:29:24 -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 Dr0bbASRspxyQccT for ; Wed, 30 Jun 2010 17:29:24 -0700 (PDT) Received: from dastard (unverified [121.44.238.155]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 29713587-1927428 for multiple; Thu, 01 Jul 2010 09:54:25 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OU7Zo-00083M-2q; Thu, 01 Jul 2010 10:24:24 +1000 Date: Thu, 1 Jul 2010 10:24:24 +1000 From: Dave Chinner To: "Linda A. Walsh" Cc: xfs-oss X-ASG-Orig-Subj: Re: When it rains it pours.... Subject: Re: When it rains it pours.... Message-ID: <20100701002424.GP24712@dastard> References: <4C2B37D6.50801@tlinx.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C2B37D6.50801@tlinx.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: 1277944165 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.34021 Rule breakdown below pts rule 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 30, 2010 at 05:25:58AM -0700, Linda A. Walsh wrote: > Due to another bug in lvm, my restore of this partition crashed after running a few > hours (takes alot longer to restore than to backup). > > So I decided to use the "-R" option to Resume my previously left off dump: > > # xfsrestore -R -p 180 -f /backups/Ishtar/torrents/torrents-100629-0-1611.dump . > xfsrestore: using file dump (drive_simple) strategy > xfsrestore: version 3.0.4 (dump format 3.0) - Running single-threaded > xfsrestore: resuming restore previously begun Wed Jun 30 04:41:57 2010 > xfsrestore: examining media file 0 > xfsrestore: seeking past portion of media file already restored > > Looks good so far!..Yup, and.. > > xfsrestore: drive_simple.c:770: do_seek_mark: Assertion `nreadneeded64 <= ( ( intgen_t ) ( ( ( 1ull << ( ( unsigned long long )sizeof( intgen_t ) * ( unsigned long long )8 - ( 1ull + 1ull ))) - 1ull ) * 2ull + 1ull ))' failed. > Aborted (core dumped) > > > Say what? Um...is that supposed to be an error message? No, it's an assert failure. i.e. something a developer considered fatal and requiring debugging if it ever occurred. It's not an error message an end user is expected to understand. ;) > Why can't it just tell me why "'nreadneeded64' > 0xbfffffffffffffd" > is 'bad', or what it means? Asserts generally indicate that design constraints or assumptions have been violated which canbe hard to explain in one line to an end user.... >From a brief look at the code, it appears that the distance between the stream offset and the next tape mark is greater than MAXINTGENT. MAXINTGEN evaluates as 0x7fffffff (more commonly known as INT_MAX). Normally the file is read mark by mark, but when resuming a restore we skip from the initial header to the checkpointed file mark in one step. It seems like marks are normally less that 2GB apart, but in the case of resuming, the attempt to seek from the header to the checkpointed mark is way more than 2GB and hence it triggers the assert. I'm not sure yet how to fix this - I have't dug into the drive code in xfs_restore before so it'll take a while to understand well enough to work out a solution. In the mean time, I think restarting your restore from scratch is your best bet. Cheers, Dave. -- Dave Chinner david@fromorbit.com From mail2informacion@genion.de Wed Jun 30 23:05:33 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.0 required=5.0 tests=BAYES_99,T_HK_SPAMMY_FILENAME 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 o6145WCP166684 for ; Wed, 30 Jun 2010 23:05:33 -0500 X-ASG-Debug-ID: 1277957594-282501a90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from gockel.hmdnsgroup.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 80B8511849DE for ; Wed, 30 Jun 2010 21:13:14 -0700 (PDT) Received: from gockel.hmdnsgroup.com (gockel.hmdnsgroup.com [63.247.129.108]) by cuda.sgi.com with ESMTP id 62GywaBGlUC6nykO for ; Wed, 30 Jun 2010 21:13:14 -0700 (PDT) Received: from [127.0.0.1] (port=38155 helo=donofrioslp.com) by gockel.hmdnsgroup.com with esmtpa (Exim 4.69) (envelope-from ) id 1OU4Af-0007FV-SI; Wed, 30 Jun 2010 16:46:13 -0400 Received: from 213.0.89.7 ([213.0.89.7]) (SquirrelMail authenticated user fire4fire@donofrioslp.com) by donofrioslp.com with HTTP; Wed, 30 Jun 2010 16:46:13 -0400 Message-ID: Date: Wed, 30 Jun 2010 16:46:13 -0400 X-ASG-Orig-Subj: [Fwd: Informacion] Subject: [Fwd: Informacion] From: "Award Notificacion" Reply-To: mail2informacion@genion.de User-Agent: SquirrelMail/1.4.20 MIME-Version: 1.0 Content-Type: multipart/mixed;boundary="----=_20100630164613_36563" X-Priority: 3 (Normal) Importance: Normal X-HMDNSGroup-MailScanner-Information: Please contact the ISP for more information X-HMDNSGroup-MailScanner-ID: 1OU4Af-0007FV-SI X-HMDNSGroup-MailScanner-SpamCheck: X-HMDNSGroup-MailScanner-From: mail2informacion@genion.de X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - gockel.hmdnsgroup.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - genion.de X-Barracuda-Connect: gockel.hmdnsgroup.com[63.247.129.108] X-Barracuda-Start-Time: 1277957596 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0636 1.0000 -1.6146 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.03 X-Barracuda-Spam-Status: No, SCORE=-0.03 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.34037 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.58 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean ------=_20100630164613_36563 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit ---------------------------- Original Message ---------------------------- Subject: Informacion From: "Award Notificacion" Date: Wed, June 30, 2010 9:31 am To: -------------------------------------------------------------------------- Attn: Winner, You have been awarded a Microsoft Cash Prize, check email attachment for award letter. ------=_20100630164613_36563 Content-Type: image/jpeg; name="Official Winner Letter(2).jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Official Winner Letter(2).jpg" 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 ------=_20100630164613_36563-- From eflorac@intellique.com Tue Jun 8 09:31: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 (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o58EVe6s007072 for ; Tue, 8 Jun 2010 09:31:40 -0500 X-ASG-Debug-ID: 1280441823-581c02d10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B98D111AE93F for ; Thu, 29 Jul 2010 15:17:04 -0700 (PDT) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id GC03UNzxeGN9PbrW for ; Thu, 29 Jul 2010 15:17:04 -0700 (PDT) Received: from galadriel.home (unknown [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id 772F681806A; Fri, 30 Jul 2010 00:09:25 +0200 (CEST) Date: Fri, 30 Jul 2010 00:09:24 +0200 From: Emmanuel Florac To: Eli Morris Cc: xfs@oss.sgi.com, Dave Chinner X-ASG-Orig-Subj: Re: filesystem shrinks after using xfs_repair Subject: Re: filesystem shrinks after using xfs_repair Message-ID: <20100730000924.77d6767e@galadriel.home> In-Reply-To: References: <20100712134743.624249b2@harpe.intellique.com> <274A8D0C-4C31-4FB9-AB2D-BA3C31D497E0@ucsc.edu> <20100724005426.GN32635@dastard> <20100724023922.GP32635@dastard> <777100A1-57DE-4DE0-B1F0-64977BD694AD@ucsc.edu> <20100726034545.GE655@dastard> <10B6F36F-BE01-4BF7-9815-2E8F6BF71B41@ucsc.edu> <20100726060604.GF7362@dastard> <20100726102036.GH7362@dastard> <0EC8FE5D-212C-4030-9D59-FDF38DF4E9EE@ucsc.edu> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.20.1; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1280441826 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36469 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Thu, 29 Jul 2010 12:22:30 -0700 vous =E9criviez: > I tried filling up the disk with data to see if that worked Ok and it > did, up until this point. There is something I don't understand going > on though. 'df' says that I have 381 GB free on the disk, but I can't > write to the disk anymore because it says it there isn't any space > left on it. Is this some insane round off error or is there something > going on here? You probably ran out of inodes. Do you have many small files? --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From SRS0+oarb+59+fromorbit.com=dave@internode.on.net Tue Jun 8 10:07: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.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_33, J_CHICKENPOX_63 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 o58F7dSS009252 for ; Tue, 8 Jun 2010 10:07:40 -0500 X-ASG-Debug-ID: 1280443530-403601190000-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 53BDE1662B89 for ; Thu, 29 Jul 2010 15: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 uzrZXzAH1TfKN5GQ for ; Thu, 29 Jul 2010 15:45:30 -0700 (PDT) Received: from dastard (unverified [121.44.18.238]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33178071-1927428 for multiple; Fri, 30 Jul 2010 08:15:22 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1Oebqr-0000I4-5e; Fri, 30 Jul 2010 08:45:21 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1Oebqm-0003lW-MS; Fri, 30 Jul 2010 08:45:16 +1000 From: Dave Chinner To: linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, sandeen@sandeen.net X-ASG-Orig-Subj: [PATCH] dio: track and serialise unaligned direct IO Subject: [PATCH] dio: track and serialise unaligned direct IO Date: Fri, 30 Jul 2010 08:45:16 +1000 Message-Id: <1280443516-14448-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1280443532 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36470 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: Dave Chinner If we get two unaligned direct IO's to the same filesystem block that is marked as a new allocation (i.e. buffer_new), then both IOs will zero the portion of the block they are not writing data to. As a result, when the IOs complete there will be a portion of the block that contains zeros from the last IO to complete rather than the data that should be there. This is easily manifested by qemu using aio+dio with an unaligned guest filesystem - every IO is unaligned and fileystem corruption is encountered in the guest filesystem. xfstest 240 (from Eric Sandeen) is also a simple reproducer. To avoid this problem, track unaligned IO that triggers sub-block zeroing and check new incoming unaligned IO that require sub-block zeroing against that list. If we get an overlap where the start and end of unaligned IOs hit the same filesystem block, then we need to block the incoming IOs until the IO that is zeroing the block completes. The blocked IO can then continue without needing to do any zeroing and hence won't overwrite valid data with zeros. Signed-off-by: Dave Chinner --- fs/direct-io.c | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 146 insertions(+), 6 deletions(-) diff --git a/fs/direct-io.c b/fs/direct-io.c index a10cb91..611524e 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -71,6 +71,9 @@ struct dio { unsigned start_zero_done; /* flag: sub-blocksize zeroing has been performed at the start of a write */ +#define LAST_SECTOR ((sector_t)-1LL) + sector_t zero_block_front; /* fs block we are zeroing at front */ + sector_t zero_block_rear; /* fs block we are zeroing at rear */ int pages_in_io; /* approximate total IO pages */ size_t size; /* total request size (doesn't change)*/ sector_t block_in_file; /* Current offset into the underlying @@ -135,6 +138,101 @@ struct dio { struct page *pages[DIO_PAGES]; /* page buffer */ }; + +/* + * record fs blocks we are doing zeroing on in a zero block list. + * unaligned IO is not very performant and so is relatively uncommon, + * so a global list should be sufficent to track them. + */ +struct dio_zero_block { + struct list_head dio_list; /* list of io in progress */ + sector_t zero_block; /* block being zeroed */ + struct dio *dio; /* owner dio */ + wait_queue_head_t wq; /* New IO block here */ + atomic_t ref; /* reference count */ +}; + +DEFINE_SPINLOCK(dio_zero_block_lock); +LIST_HEAD(dio_zero_block_list); + +/* + * Add a filesystem block to the list of blocks we are tracking. + */ +static void +dio_start_zero_block(struct dio *dio, sector_t zero_block) +{ + struct dio_zero_block *zb; + + zb = kmalloc(sizeof(*zb), GFP_NOIO); + if (!zb) + return; + INIT_LIST_HEAD(&zb->dio_list); + init_waitqueue_head(&zb->wq); + zb->zero_block = zero_block; + zb->dio = dio; + atomic_set(&zb->ref, 1); + + spin_lock(&dio_zero_block_lock); + list_add(&zb->dio_list, &dio_zero_block_list); + spin_unlock(&dio_zero_block_lock); +} + +static void +dio_drop_zero_block(struct dio_zero_block *zb) +{ + if (atomic_dec_and_test(&zb->ref)) + kfree(zb); +} + +/* + * Check whether a filesystem block is currently being zeroed, and if it is + * wait for it to complete before returning. If we waited for a block being + * zeroed, return 1 to indicate that the block is already initialised, + * otherwise return 0 to indicate that it needs zeroing. + */ +static int +dio_wait_zero_block(struct dio *dio, sector_t zero_block) +{ + struct dio_zero_block *zb; + + spin_lock(&dio_zero_block_lock); + list_for_each_entry(zb, &dio_zero_block_list, dio_list) { + if (zb->dio->inode != dio->inode) + continue; + if (zb->zero_block != zero_block) + continue; + atomic_inc(&zb->ref); + spin_unlock(&dio_zero_block_lock); + wait_event(zb->wq, (list_empty(&zb->dio_list))); + dio_drop_zero_block(zb); + return 1; + } + spin_unlock(&dio_zero_block_lock); + return 0; +} + +/* + * Complete a block zeroing and wake up anyone waiting for it. + */ +static void dio_end_zero_block(struct dio *dio, sector_t zero_block) +{ + struct dio_zero_block *zb; + + spin_lock(&dio_zero_block_lock); + list_for_each_entry(zb, &dio_zero_block_list, dio_list) { + if (zb->dio->inode != dio->inode) + continue; + if (zb->zero_block != zero_block) + continue; + list_del_init(&zb->dio_list); + spin_unlock(&dio_zero_block_lock); + wake_up(&zb->wq); + dio_drop_zero_block(zb); + return; + } + spin_unlock(&dio_zero_block_lock); +} + /* * How many pages are in the queue? */ @@ -253,6 +351,11 @@ static int dio_complete(struct dio *dio, loff_t offset, int ret, bool is_async) aio_complete(dio->iocb, ret, 0); } + if (dio->zero_block_front != LAST_SECTOR) + dio_end_zero_block(dio, dio->zero_block_front); + if (dio->zero_block_rear != LAST_SECTOR) + dio_end_zero_block(dio, dio->zero_block_rear); + if (dio->flags & DIO_LOCKING) /* lockdep: non-owner release */ up_read_non_owner(&dio->inode->i_alloc_sem); @@ -777,6 +880,12 @@ static void clean_blockdev_aliases(struct dio *dio) * block with zeros. This happens only if user-buffer, fileoffset or * io length is not filesystem block-size multiple. * + * We need to track the blocks we are zeroing. If we have concurrent IOs that hit + * the same start or end block, we do not want all the IOs to zero the portion + * they are not writing data to as that will overwrite data from the other IOs. + * Hence we need to block until the first unaligned IO completes before we can + * continue (without executing any zeroing). + * * `end' is zero if we're doing the start of the IO, 1 at the end of the * IO. */ @@ -784,8 +893,8 @@ static void dio_zero_block(struct dio *dio, int end) { unsigned dio_blocks_per_fs_block; unsigned this_chunk_blocks; /* In dio_blocks */ - unsigned this_chunk_bytes; struct page *page; + sector_t fsblock; dio->start_zero_done = 1; if (!dio->blkfactor || !buffer_new(&dio->map_bh)) @@ -797,17 +906,41 @@ static void dio_zero_block(struct dio *dio, int end) if (!this_chunk_blocks) return; + if (end) + this_chunk_blocks = dio_blocks_per_fs_block - this_chunk_blocks; + /* * We need to zero out part of an fs block. It is either at the - * beginning or the end of the fs block. + * beginning or the end of the fs block, but first we need to check if + * there is already a zeroing being run on this block. + * + * If we are doing a sub-block IO (i.e. zeroing both front and rear of + * the same block) we don't need to wait or set a gaurd for the rear of + * the block as we already have one set. */ - if (end) - this_chunk_blocks = dio_blocks_per_fs_block - this_chunk_blocks; + fsblock = dio->block_in_file >> dio->blkfactor; + if (!end || dio->zero_block_front != fsblock) { - this_chunk_bytes = this_chunk_blocks << dio->blkbits; + /* wait for any zeroing already in progress */ + if (dio_wait_zero_block(dio, fsblock)) { + /* skip the range we would have zeroed. */ + dio->next_block_for_io += this_chunk_blocks; + return; + } + + /* + * we are going to zero stuff now, so set a guard to catch + * others that might want to zero the same block. + */ + dio_start_zero_block(dio, fsblock); + if (end) + dio->zero_block_rear = fsblock; + else + dio->zero_block_front = fsblock; + } page = ZERO_PAGE(0); - if (submit_page_section(dio, page, 0, this_chunk_bytes, + if (submit_page_section(dio, page, 0, this_chunk_blocks << dio->blkbits, dio->next_block_for_io)) return; @@ -1191,6 +1324,13 @@ __blockdev_direct_IO_newtrunc(int rw, struct kiocb *iocb, struct inode *inode, */ memset(dio, 0, offsetof(struct dio, pages)); + /* + * zero_blocks need to initialised to largeѕt value to avoid + * matching the zero block accidentally. + */ + dio->zero_block_front = LAST_SECTOR; + dio->zero_block_rear = LAST_SECTOR; + dio->flags = flags; if (dio->flags & DIO_LOCKING) { /* watch out for a 0 len io from a tricksy fs */ -- 1.7.1 From ermorris@ucsc.edu Tue Jun 8 10:10:51 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o58FAoJe009761 for ; Tue, 8 Jun 2010 10:10:51 -0500 X-ASG-Debug-ID: 1280443723-6d5800c60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ucsc.edu (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 5584048086A for ; Thu, 29 Jul 2010 15:48:43 -0700 (PDT) Received: from ucsc.edu (email-prod-out-1.ucsc.edu [128.114.129.85]) by cuda.sgi.com with ESMTP id RXH3J6BVDAjnXxyX for ; Thu, 29 Jul 2010 15:48:43 -0700 (PDT) X-UCSC-EDU-Sender: X-UCSC-EDU-Scanned-By: email-prod-out-1 X-UCSC-EDU-Submitted-Via: SMTP [128.114.125.112] X-UCSC-EDU-ClamAVCheck: not spam, ClamAV(signaure=none) X-UCSC-EDU-SpamCheck: No, score=-1.44 required=5 tests=ALL_TRUSTED X-UCSC-EDU-SpamScore: X-UCSC-EDU-SpamFlag: NO X-UCSC-EDU-SpamReport: -1.4 ALL_TRUSTED Passed through trusted hosts only via SMTP Received: from [128.114.125.112] (HELO ucsc.edu) by email-prod-out-1.ucsc.edu (CommuniGate Pro SMTP 5.2.13) with ESMTPS id 16510581; Thu, 29 Jul 2010 15:48:43 -0700 Received: by email-prod-fe-1.ucsc.edu (CommuniGate Pro PIPE 5.2.13) with PIPE id 358350670; Thu, 29 Jul 2010 15:48:43 -0700 X-UCSC-EDU-ClamAVCheck: not spam, ClamAV(signaure=none) Received: from [128.114.25.211] (account ermorris@ucsc.edu HELO dhcp-25-211.ucsc.edu) by email-prod-fe-1.ucsc.edu (CommuniGate Pro SMTP 5.2.13) with ESMTPSA id 358350668; Thu, 29 Jul 2010 15:48:38 -0700 X-ASG-Orig-Subj: Re: filesystem shrinks after using xfs_repair Subject: Re: filesystem shrinks after using xfs_repair Mime-Version: 1.0 (Apple Message framework v1081) Content-Type: text/plain; charset=iso-8859-1 From: Eli Morris In-Reply-To: <20100730000924.77d6767e@galadriel.home> Date: Thu, 29 Jul 2010 15:48:38 -0700 Cc: xfs@oss.sgi.com, Dave Chinner Content-Transfer-Encoding: quoted-printable Message-Id: References: <20100712134743.624249b2@harpe.intellique.com> <274A8D0C-4C31-4FB9-AB2D-BA3C31D497E0@ucsc.edu> <20100724005426.GN32635@dastard> <20100724023922.GP32635@dastard> <777100A1-57DE-4DE0-B1F0-64977BD694AD@ucsc.edu> <20100726034545.GE655@dastard> <10B6F36F-BE01-4BF7-9815-2E8F6BF71B41@ucsc.edu> <20100726060604.GF7362@dastard> <20100726102036.GH7362@dastard> <0EC8FE5D-212C-4030-9D59-FDF38DF4E9EE@ucsc.edu> <20100730000924.77d6767e@galadriel.home> To: Emmanuel Florac X-Mailer: Apple Mail (2.1081) X-Barracuda-Connect: email-prod-out-1.ucsc.edu[128.114.129.85] X-Barracuda-Start-Time: 1280443724 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36470 Rule breakdown below pts rule 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 Jul 29, 2010, at 3:09 PM, Emmanuel Florac wrote: > Le Thu, 29 Jul 2010 12:22:30 -0700 vous =E9criviez: >=20 >> I tried filling up the disk with data to see if that worked Ok and it >> did, up until this point. There is something I don't understand going >> on though. 'df' says that I have 381 GB free on the disk, but I can't >> write to the disk anymore because it says it there isn't any space >> left on it. Is this some insane round off error or is there something >> going on here? >=20 > You probably ran out of inodes. Do you have many small files? >=20 > --=20 > = ------------------------------------------------------------------------ > Emmanuel Florac | Direction technique > | Intellique > | > | +33 1 78 94 84 02 > = ------------------------------------------------------------------------ Hi, I checked the inodes with this command, and it looks like I have plenty = left. It's this entry, '/dev/mapper/vg1-vol5'. =20 [root@nimbus ~]# df -hi Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sdb2 6.2M 208K 6.0M 4% / /dev/sda5 219M 452K 218M 1% /export /dev/sda2 1001K 5.5K 996K 1% /var tmpfs 4.0M 1 4.0M 1% /dev/shm /dev/mapper/vg1-vol5 1.5G 1020K 1.5G 1% /export/vol5 /dev/sdb1 127M 42K 127M 1% /storage tmpfs 4.0M 629 4.0M 1% /var/lib/ganglia/rrds thanks, Eli From SRS0+oarb+59+fromorbit.com=dave@internode.on.net Tue Jun 8 10:18: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=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o58FI4k9010766 for ; Tue, 8 Jun 2010 10:18:05 -0500 X-ASG-Debug-ID: 1280444156-439201420000-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 62D511659A7A for ; Thu, 29 Jul 2010 15:55:57 -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 UIbea9OV0Cbt7236 for ; Thu, 29 Jul 2010 15:55:57 -0700 (PDT) Received: from dastard (unverified [121.44.18.238]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33179008-1927428 for multiple; Fri, 30 Jul 2010 08:25:55 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1Oec13-0000J8-Pr; Fri, 30 Jul 2010 08:55:53 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1Oec0z-0003nY-KA; Fri, 30 Jul 2010 08:55:49 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: npiggin@kernel.de X-ASG-Orig-Subj: [PATCH 1/2] xfs: unlock items before allowing the CIL to commit Subject: [PATCH 1/2] xfs: unlock items before allowing the CIL to commit Date: Fri, 30 Jul 2010 08:55:45 +1000 Message-Id: <1280444146-14540-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1280444146-14540-1-git-send-email-david@fromorbit.com> References: <1280444146-14540-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1280444158 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36472 Rule breakdown below pts rule 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 When we commit a transaction using delayed logging, we need to unlock the items in the transaciton before we unlock the CIL context and allow it to be checkpointed. If we unlock them after we release the CIl context lock, the CIL can checkpoint and complete before we free the log items. This breaks stale buffer item unlock and unpin processing as there is an implicit assumption that the unlock will occur before the unpin. Also, some log items need to store the LSN of the transaction commit in the item (inodes and EFIs) and so can race with other transaction completions if we don't prevent the CIL from checkpointing before the unlock occurs. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log_cil.c | 14 ++++++++++++++ fs/xfs/xfs_trans.c | 5 +---- fs/xfs/xfs_trans_priv.h | 3 ++- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index 31e4ea2..ef8e7d9 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -377,9 +377,23 @@ xfs_log_commit_cil( xfs_log_done(mp, tp->t_ticket, NULL, log_flags); xfs_trans_unreserve_and_mod_sb(tp); + /* + * Once all the items of the transaction have been copied to the CIL, + * the items can be unlocked and freed. + * + * This needs to be done before we drop the CIL context lock because we + * have to update state in the log items and unlock them before they go + * to disk. If we don't, then the CIL checkpoint can race with us and + * we can run checkpoint completion before we've updated and unlocked + * the log items. This affects (at least) processing of stale buffers, + * inodes and EFIs. + */ + xfs_trans_free_items(tp, *commit_lsn, 0); + /* check for background commit before unlock */ if (log->l_cilp->xc_ctx->space_used > XLOG_CIL_SPACE_LIMIT(log)) push = 1; + up_read(&log->l_cilp->xc_ctx_lock); /* diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index fdca741..1c47eda 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -1167,7 +1167,7 @@ xfs_trans_del_item( * Unlock all of the items of a transaction and free all the descriptors * of that transaction. */ -STATIC void +void xfs_trans_free_items( struct xfs_trans *tp, xfs_lsn_t commit_lsn, @@ -1653,9 +1653,6 @@ xfs_trans_commit_cil( return error; current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); - - /* xfs_trans_free_items() unlocks them first */ - xfs_trans_free_items(tp, *commit_lsn, 0); xfs_trans_free(tp); return 0; } diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index e2d93d8..62da86c 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h @@ -25,7 +25,8 @@ struct xfs_trans; void xfs_trans_add_item(struct xfs_trans *, struct xfs_log_item *); void xfs_trans_del_item(struct xfs_log_item *); - +void xfs_trans_free_items(struct xfs_trans *tp, xfs_lsn_t commit_lsn, + int flags); void xfs_trans_item_committed(struct xfs_log_item *lip, xfs_lsn_t commit_lsn, int aborted); void xfs_trans_unreserve_and_mod_sb(struct xfs_trans *tp); -- 1.7.1 From SRS0+fbW6+59+fromorbit.com=dave@internode.on.net Tue Jun 8 10:18:06 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 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 o58FI5tZ010771 for ; Tue, 8 Jun 2010 10:18:05 -0500 X-ASG-Debug-ID: 1280444610-235d013f0000-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 4A07B11B0528 for ; Thu, 29 Jul 2010 16:03:30 -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 r6XLCT6q94Lzqodi for ; Thu, 29 Jul 2010 16:03:30 -0700 (PDT) Received: from dastard (unverified [121.44.18.238]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33422383-1927428 for multiple; Fri, 30 Jul 2010 08:25:54 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1Oec13-0000J7-OO; Fri, 30 Jul 2010 08:55:53 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1Oec0z-0003nW-IK; Fri, 30 Jul 2010 08:55:49 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: npiggin@kernel.de X-ASG-Orig-Subj: [PATCH 0/2] xfs: fix bugs uncovered by dbench testing Subject: [PATCH 0/2] xfs: fix bugs uncovered by dbench testing Date: Fri, 30 Jul 2010 08:55:44 +1000 Message-Id: <1280444146-14540-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1280444612 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0121 1.0000 -1.9420 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.94 X-Barracuda-Spam-Status: No, SCORE=-1.94 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36471 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The reproducer Nick found that hung the XFS filesystem has two different causes. Both manifest in the same way, so it was difficult to tell them aparṫ - they left an item that could notbe flushed stuck in the AIL and hence preventing the tail of the log from being moved forward. The most frequently tripped problem (generally within 5 minutes) was the CIL commit race when the checkpoitn could commit before the transaction items were unlocked, resulting in stale information in log items and incorrect processing of stale buffers. I coul dnot reproduce this race condition with a debug kernel, which explain why my previous dbench testing did not uncover it. Less frequently tripped was the inode cluster freeing problem - it would take around 2 hours on average to trip this one, and it does not require delayed logging to hit. Nick, you'll need both patches to avoid the the hangs you reported - I've had your test case running now for just over ten hours without any issues so far. From SRS0+fbW6+59+fromorbit.com=dave@internode.on.net Tue Jun 8 10:18: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_62 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o58FIEWn010807 for ; Tue, 8 Jun 2010 10:18:14 -0500 X-ASG-Debug-ID: 1280444618-743803bf0000-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 B77D511B052F for ; Thu, 29 Jul 2010 16:03:39 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id qIsGAmdXbvBmMLDx for ; Thu, 29 Jul 2010 16:03:39 -0700 (PDT) Received: from dastard (unverified [121.44.18.238]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33422391-1927428 for multiple; Fri, 30 Jul 2010 08:26:04 +0930 (CST) Received: from disturbed ([192.168.1.9]) by dastard with esmtp (Exim 4.71) (envelope-from ) id 1Oec1D-0000JH-RH; Fri, 30 Jul 2010 08:56:03 +1000 Received: from dave by disturbed with local (Exim 4.71) (envelope-from ) id 1Oec0z-0003na-MD; Fri, 30 Jul 2010 08:55:49 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: npiggin@kernel.de X-ASG-Orig-Subj: [PATCH 2/2] xfs: ensure we mark all inodes in a freed cluster XFS_ISTALE Subject: [PATCH 2/2] xfs: ensure we mark all inodes in a freed cluster XFS_ISTALE Date: Fri, 30 Jul 2010 08:55:46 +1000 Message-Id: <1280444146-14540-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1280444146-14540-1-git-send-email-david@fromorbit.com> References: <1280444146-14540-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1280444620 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36471 Rule breakdown below pts rule 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 Under heavy load parallel metadata loads (e.g. dbench), we can fail to mark all the inodes in a cluster being freed as XFS_ISTALE as we skip inodes we cannot get the XFS_ILOCK_EXCL or the flush lock on. When this happens and the inode cluster buffer has already been marked stale and freed, inode reclaim can try to write the inode out as it is dirty and not marked stale. This can result in writing th metadata to an freed extent, or in the case it has already been overwritten trigger a magic number check failure and return an EUCLEAN error such as: Filesystem "ram0": inode 0x442ba1 background reclaim flush failed with 117 Fix this by ensuring that we hoover up all in memory inodes in the cluster and mark them XFS_ISTALE when freeing the cluster. Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 88 ++++++++++++++++++++++++++++----------------------- 1 files changed, 48 insertions(+), 40 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 68415cb..abc50b6 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1914,6 +1914,11 @@ xfs_iunlink_remove( return 0; } +/* + * A big issue when freeing the inode cluster is is that we _cannot_ skip any + * inodes that are in memory - they all must be marked stale and attached to + * the cluster buffer. + */ STATIC void xfs_ifree_cluster( xfs_inode_t *free_ip, @@ -1945,8 +1950,6 @@ xfs_ifree_cluster( } for (j = 0; j < nbufs; j++, inum += ninodes) { - int found = 0; - blkno = XFS_AGB_TO_DADDR(mp, XFS_INO_TO_AGNO(mp, inum), XFS_INO_TO_AGBNO(mp, inum)); @@ -1963,26 +1966,6 @@ xfs_ifree_cluster( XBF_LOCK); /* - * Walk the inodes already attached to the buffer and mark them - * stale. These will all have the flush locks held, so an - * in-memory inode walk can't lock them. - */ - lip = XFS_BUF_FSPRIVATE(bp, xfs_log_item_t *); - while (lip) { - if (lip->li_type == XFS_LI_INODE) { - iip = (xfs_inode_log_item_t *)lip; - ASSERT(iip->ili_logged == 1); - lip->li_cb = xfs_istale_done; - xfs_trans_ail_copy_lsn(mp->m_ail, - &iip->ili_flush_lsn, - &iip->ili_item.li_lsn); - xfs_iflags_set(iip->ili_inode, XFS_ISTALE); - found++; - } - lip = lip->li_bio_list; - } - - /* * For each inode in memory attempt to add it to the inode * buffer and set it up for being staled on buffer IO * completion. This is safe as we've locked out tail pushing @@ -1999,42 +1982,68 @@ xfs_ifree_cluster( /* Inode not in memory or stale, nothing to do */ if (!ip || xfs_iflags_test(ip, XFS_ISTALE)) { +next_inode: read_unlock(&pag->pag_ici_lock); continue; } - /* don't try to lock/unlock the current inode */ + /* + * Walk the inodes already attached to the buffer to + * see if this inode is already there. If so, mark it + * stale. These will all have the flush locks held, so an + * in-memory inode walk can't lock them. We do this + * inside the loop so that we know for certain that we + * don't encounter inodes with the flush lock already + * held and hence deadlock below. + */ + lip = XFS_BUF_FSPRIVATE(bp, xfs_log_item_t *); + do { + if (lip->li_type == XFS_LI_INODE) { + iip = (xfs_inode_log_item_t *)lip; + if (iip->ili_inode != ip) + continue; + ASSERT(iip->ili_logged == 1); + lip->li_cb = xfs_istale_done; + xfs_trans_ail_copy_lsn(mp->m_ail, + &iip->ili_flush_lsn, + &iip->ili_item.li_lsn); + xfs_iflags_set(iip->ili_inode, XFS_ISTALE); + goto next_inode; + } + } while ((lip = lip->li_bio_list) != NULL); + + /* + * Don't try to lock/unlock the current inode, but we + * _cannot_ skip the other inodes that we did not find + * in the list attached to the buffer and are not + * already marked stale. If we can't lock it, back off + * and retry. + */ + if (ip != free_ip && !xfs_ilock_nowait(ip, XFS_ILOCK_EXCL)) { read_unlock(&pag->pag_ici_lock); + delay(1); + i--; continue; } read_unlock(&pag->pag_ici_lock); - if (!xfs_iflock_nowait(ip)) { - if (ip != free_ip) - xfs_iunlock(ip, XFS_ILOCK_EXCL); - continue; - } - + xfs_iflock(ip); xfs_iflags_set(ip, XFS_ISTALE); - if (xfs_inode_clean(ip)) { - ASSERT(ip != free_ip); - xfs_ifunlock(ip); - xfs_iunlock(ip, XFS_ILOCK_EXCL); - continue; - } + /* + * we don't need to attach clean inodes or those only + * with unlogged changes (which we throw away, anyway). + */ iip = ip->i_itemp; - if (!iip) { - /* inode with unlogged changes only */ + if (!iip || xfs_inode_clean(ip)) { ASSERT(ip != free_ip); ip->i_update_core = 0; xfs_ifunlock(ip); xfs_iunlock(ip, XFS_ILOCK_EXCL); continue; } - found++; iip->ili_last_fields = iip->ili_format.ilf_fields; iip->ili_format.ilf_fields = 0; @@ -2049,8 +2058,7 @@ xfs_ifree_cluster( xfs_iunlock(ip, XFS_ILOCK_EXCL); } - if (found) - xfs_trans_stale_inode_buf(tp, bp); + xfs_trans_stale_inode_buf(tp, bp); xfs_trans_binval(tp, bp); } -- 1.7.1 From SRS0+V7Gk+59+fromorbit.com=david@internode.on.net Tue Jun 8 10:23:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o58FNWxs010985 for ; Tue, 8 Jun 2010 10:23:32 -0500 X-ASG-Debug-ID: 1280444221-39ba03570000-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 CD95D480914 for ; Thu, 29 Jul 2010 15:57:01 -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 tbzxsuwqnRLDsIWF for ; Thu, 29 Jul 2010 15:57:01 -0700 (PDT) Received: from dastard (unverified [121.44.18.238]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33201331-1927428 for multiple; Fri, 30 Jul 2010 08:26:59 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1Oec27-0000JN-1J; Fri, 30 Jul 2010 08:56:59 +1000 Date: Fri, 30 Jul 2010 08:56:58 +1000 From: Dave Chinner To: Nick Piggin Cc: Nick Piggin , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS hang in xlog_grant_log_space Subject: Re: XFS hang in xlog_grant_log_space Message-ID: <20100729225658.GM655@dastard> References: <20100722190100.GA22269@amd> <20100723135514.GJ32635@dastard> <20100727070538.GA2893@amd> <20100727080632.GA4958@amd> <20100727113626.GA2884@amd> <20100727133038.GP7362@dastard> <20100727145808.GQ7362@dastard> <20100728131744.GS7362@dastard> <20100729140546.GB7217@amd> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100729140546.GB7217@amd> 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: 1280444222 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36472 Rule breakdown below pts rule 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, Jul 30, 2010 at 12:05:46AM +1000, Nick Piggin wrote: > On Wed, Jul 28, 2010 at 11:17:44PM +1000, Dave Chinner wrote: > > Something very strange is happening, and to make matters worse I > > cannot reproduce it with a debug kernel (ran for 3 hours without > > failing). Hence it smells like a race condition somewhere. > > > > I've reproduced it without delayed logging, so it is not directly > > related to that functionality. > > > > I've seen this warning: > > > > Filesystem "ram0": inode 0x704680 background reclaim flush failed with 117 > > > > Which indicates we failed to mark an inode stale when freeing an > > inode cluster, but I think I've fixed that and the problem still > > shows up. It's posible the last version didn't fix it, but.... > > I've seen that one a couple of times too. Keeps coming back each > time you echo 3 > /proc/sys/vm/drop_caches :) Yup - it's an unflushable inode that is pinning the tail of the log, hence causing the log space hangs. > > Now I've got the ag iterator rotor patch in place as well and > > possibly a different version of the cluster free fix to what I > > previously tested and it's now been running for almost half an hour. > > I can't say yet whether I've fixed the bug of just changed the > > timing enough to avoid it. I'll leave this test running over night > > and redo individual patch testing tomorrow. > > I reproduced it with fs_stress now too. Any patches I could test > for you just let me know. You should see them in a few minutes ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+G/f0+59+fromorbit.com=david@internode.on.net Tue Jun 8 10:24: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 o58FO2bN011013 for ; Tue, 8 Jun 2010 10:24:02 -0500 X-ASG-Debug-ID: 1280444514-6d5901360000-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 30D5B480939 for ; Thu, 29 Jul 2010 16:01:54 -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 WjtF4ZHRRBojALo4 for ; Thu, 29 Jul 2010 16:01:54 -0700 (PDT) Received: from dastard (unverified [121.44.18.238]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 21729772-1927428 for multiple; Fri, 30 Jul 2010 08:31:49 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1Oec6l-0000K2-Qp; Fri, 30 Jul 2010 09:01:47 +1000 Date: Fri, 30 Jul 2010 09:01:47 +1000 From: Dave Chinner To: Eli Morris Cc: xfs@oss.sgi.com, Emmanuel Florac X-ASG-Orig-Subj: Re: filesystem shrinks after using xfs_repair Subject: Re: filesystem shrinks after using xfs_repair Message-ID: <20100729230147.GN655@dastard> References: <20100724023922.GP32635@dastard> <777100A1-57DE-4DE0-B1F0-64977BD694AD@ucsc.edu> <20100726034545.GE655@dastard> <10B6F36F-BE01-4BF7-9815-2E8F6BF71B41@ucsc.edu> <20100726060604.GF7362@dastard> <20100726102036.GH7362@dastard> <0EC8FE5D-212C-4030-9D59-FDF38DF4E9EE@ucsc.edu> 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: 1280444516 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36472 Rule breakdown below pts rule 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, Jul 29, 2010 at 12:22:30PM -0700, Eli Morris wrote: > I tried filling up the disk with data to see if that worked Ok and > it did, up until this point. There is something I don't understand > going on though. 'df' says that I have 381 GB free on the disk, > but I can't write to the disk anymore because it says it there > isn't any space left on it. Is this some insane round off error or > is there something going on here? If you haven't specified inode64, then all inodes are located below the 1TB mark. You've probably run out of space (or contiguous 16k chunks of free space) below 1TB. Using inode64 will avoid this - for a filesystem of that size, inode64 is probably a good idea as it will significantly improve performance. Keep in mind that legacy 32bit applications may have problems with 64 bit inode numbers, so if you have such applications (or 32 bit NFS clients) then you need to check carefully as to whether 64 bit inodes will work correctly or not.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From ermorris@ucsc.edu Tue Jun 8 10:38:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o58FcFXx011777 for ; Tue, 8 Jun 2010 10:38:15 -0500 X-ASG-Debug-ID: 1280445368-439301b60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ucsc.edu (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 30ADF13E7FD1 for ; Thu, 29 Jul 2010 16:16:08 -0700 (PDT) Received: from ucsc.edu (email-prod-out-1.ucsc.edu [128.114.129.85]) by cuda.sgi.com with ESMTP id KGhL7WKHuYfZf13n for ; Thu, 29 Jul 2010 16:16:08 -0700 (PDT) X-UCSC-EDU-Sender: X-UCSC-EDU-Scanned-By: email-prod-out-1 X-UCSC-EDU-Submitted-Via: SMTP [128.114.125.112] X-UCSC-EDU-ClamAVCheck: not spam, ClamAV(signaure=none) X-UCSC-EDU-SpamCheck: No, score=-1.44 required=5 tests=ALL_TRUSTED X-UCSC-EDU-SpamScore: X-UCSC-EDU-SpamFlag: NO X-UCSC-EDU-SpamReport: -1.4 ALL_TRUSTED Passed through trusted hosts only via SMTP Received: from [128.114.125.112] (HELO ucsc.edu) by email-prod-out-1.ucsc.edu (CommuniGate Pro SMTP 5.2.13) with ESMTPS id 16512709; Thu, 29 Jul 2010 16:16:08 -0700 Received: by email-prod-fe-1.ucsc.edu (CommuniGate Pro PIPE 5.2.13) with PIPE id 358355253; Thu, 29 Jul 2010 16:16:08 -0700 X-UCSC-EDU-ClamAVCheck: not spam, ClamAV(signaure=none) Received: from [128.114.25.211] (account ermorris@ucsc.edu HELO dhcp-25-211.ucsc.edu) by email-prod-fe-1.ucsc.edu (CommuniGate Pro SMTP 5.2.13) with ESMTPSA id 358355243; Thu, 29 Jul 2010 16:15:55 -0700 X-ASG-Orig-Subj: Re: filesystem shrinks after using xfs_repair Subject: Re: filesystem shrinks after using xfs_repair Mime-Version: 1.0 (Apple Message framework v1081) Content-Type: text/plain; charset=us-ascii From: Eli Morris In-Reply-To: <20100729230147.GN655@dastard> Date: Thu, 29 Jul 2010 16:15:55 -0700 Cc: xfs@oss.sgi.com, Emmanuel Florac Content-Transfer-Encoding: quoted-printable Message-Id: <04349CE2-CF8B-463C-8B06-5E4E59E869B2@ucsc.edu> References: <20100724023922.GP32635@dastard> <777100A1-57DE-4DE0-B1F0-64977BD694AD@ucsc.edu> <20100726034545.GE655@dastard> <10B6F36F-BE01-4BF7-9815-2E8F6BF71B41@ucsc.edu> <20100726060604.GF7362@dastard> <20100726102036.GH7362@dastard> <0EC8FE5D-212C-4030-9D59-FDF38DF4E9EE@ucsc.edu> <20100729230147.GN655@dastard> To: Dave Chinner X-Mailer: Apple Mail (2.1081) X-Barracuda-Connect: email-prod-out-1.ucsc.edu[128.114.129.85] X-Barracuda-Start-Time: 1280445369 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36472 Rule breakdown below pts rule 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 Jul 29, 2010, at 4:01 PM, Dave Chinner wrote: > On Thu, Jul 29, 2010 at 12:22:30PM -0700, Eli Morris wrote: >> I tried filling up the disk with data to see if that worked Ok and >> it did, up until this point. There is something I don't understand >> going on though. 'df' says that I have 381 GB free on the disk, >> but I can't write to the disk anymore because it says it there >> isn't any space left on it. Is this some insane round off error or >> is there something going on here? >=20 > If you haven't specified inode64, then all inodes are located below > the 1TB mark. You've probably run out of space (or contiguous 16k > chunks of free space) below 1TB. Using inode64 will avoid this - for > a filesystem of that size, inode64 is probably a good idea as it > will significantly improve performance. >=20 > Keep in mind that legacy 32bit applications may have problems with > 64 bit inode numbers, so if you have such applications (or 32 bit > NFS clients) then you need to check carefully as to whether 64 bit > inodes will work correctly or not.... >=20 > Cheers, >=20 > Dave. > --=20 > Dave Chinner > david@fromorbit.com Hi Dave, Is that something I could do now, or only when the filesystem is = created? If I mount it with '-o inode64', can I mount it without that = later, or once I write to the filesystem like that, can I not go back to = mounting it in 32 bit mode?=20 Thanks again, Eli From michael.monnerie@is.it-management.at Tue Jun 8 12:02:11 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o58H2BSJ015187 for ; Tue, 8 Jun 2010 12:02:11 -0500 X-ASG-Debug-ID: 1280450401-6d5d02fe0000-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 776FF480A81 for ; Thu, 29 Jul 2010 17:40:02 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id DToYAQJVNIiq6aua for ; Thu, 29 Jul 2010 17:40:02 -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 69B8C17A; Fri, 30 Jul 2010 02:40:00 +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 1F179401C33; Fri, 30 Jul 2010 02:40:00 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: filesystem shrinks after using xfs_repair Subject: Re: filesystem shrinks after using xfs_repair Date: Fri, 30 Jul 2010 02:39:55 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.34.1-zmi; KDE/4.3.5; x86_64; ; ) References: <20100729230147.GN655@dastard> <04349CE2-CF8B-463C-8B06-5E4E59E869B2@ucsc.edu> In-Reply-To: <04349CE2-CF8B-463C-8B06-5E4E59E869B2@ucsc.edu> Cc: Eli Morris MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1720842.L9Ubu44vQO"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201007300239.59574@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1280450402 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36478 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart1720842.L9Ubu44vQO Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Freitag, 30. Juli 2010 Eli Morris wrote: > Is that something I could do now, or only when the filesystem is > created? If I mount it with '-o inode64', can I mount it without > that later, or once I write to the filesystem like that, can I not > go back to mounting it in 32 bit mode?=20 =20 Once you mount with inode64, you can't go back. I'm not sure which applications are "broken", but I use inode64 for a=20 backup server where lots of Linux boxes connect to over NFS, and a Samba=20 for Windows PCs which has inode64, and at least didn't see any problem=20 over the years. That doesn't mean there isn't a problem, of course ;-) =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 ****** Aktuelles Radiointerview! ****** http://www.it-podcast.at/aktuelle-sendung.html // Wir haben im Moment zwei H=E4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart1720842.L9Ubu44vQO 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) iEYEABECAAYFAkxSH18ACgkQzhSR9xwSCbTx9ACgxEv5/D1aNj5EhphOQ30ST+e1 iX4An2sW95zH6USiJLvNZws8lRJn7ZGe =ar5P -----END PGP SIGNATURE----- --nextPart1720842.L9Ubu44vQO-- From ermorris@ucsc.edu Tue Jun 8 13:11: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 o58IBRBu017649 for ; Tue, 8 Jun 2010 13:11:28 -0500 X-ASG-Debug-ID: 1280455012-3eaf002c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ucsc.edu (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B3A1511B1906 for ; Thu, 29 Jul 2010 18:56:52 -0700 (PDT) Received: from ucsc.edu (email-prod-out-1.ucsc.edu [128.114.129.85]) by cuda.sgi.com with ESMTP id rM45fdy4EeBBluqY for ; Thu, 29 Jul 2010 18:56:52 -0700 (PDT) X-UCSC-EDU-Sender: X-UCSC-EDU-Scanned-By: email-prod-out-1 X-UCSC-EDU-Submitted-Via: SMTP [128.114.125.121] X-UCSC-EDU-ClamAVCheck: not spam, ClamAV(signaure=none) X-UCSC-EDU-SpamCheck: No, score=-1.44 required=5 tests=ALL_TRUSTED X-UCSC-EDU-SpamScore: X-UCSC-EDU-SpamFlag: NO X-UCSC-EDU-SpamReport: -1.4 ALL_TRUSTED Passed through trusted hosts only via SMTP Received: from [128.114.125.121] (HELO ucsc.edu) by email-prod-out-1.ucsc.edu (CommuniGate Pro SMTP 5.2.13) with ESMTPS id 16521294; Thu, 29 Jul 2010 18:49:18 -0700 Received: by email-prod-fe-2.ucsc.edu (CommuniGate Pro PIPE 5.2.13) with PIPE id 378828196; Thu, 29 Jul 2010 18:49:18 -0700 X-UCSC-EDU-ClamAVCheck: not spam, ClamAV(signaure=none) Received: from [98.234.26.5] (account ermorris@ucsc.edu HELO [10.0.1.3]) by email-prod-fe-2.ucsc.edu (CommuniGate Pro SMTP 5.2.13) with ESMTPSA id 378828178; Thu, 29 Jul 2010 18:49:05 -0700 X-ASG-Orig-Subj: Re: filesystem shrinks after using xfs_repair Subject: Re: filesystem shrinks after using xfs_repair Mime-Version: 1.0 (Apple Message framework v1081) Content-Type: text/plain; charset=iso-8859-1 From: Eli Morris In-Reply-To: <201007300239.59574@zmi.at> Date: Thu, 29 Jul 2010 18:49:04 -0700 Cc: Dave Chinner , xfs@oss.sgi.com Content-Transfer-Encoding: quoted-printable Message-Id: <562BA312-FBBA-492C-882F-2E0A93DA888F@ucsc.edu> References: <20100729230147.GN655@dastard> <04349CE2-CF8B-463C-8B06-5E4E59E869B2@ucsc.edu> <201007300239.59574@zmi.at> To: Michael Monnerie X-Mailer: Apple Mail (2.1081) X-Barracuda-Connect: email-prod-out-1.ucsc.edu[128.114.129.85] X-Barracuda-Start-Time: 1280455013 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0002 1.0000 -2.0197 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36483 Rule breakdown below pts rule 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 Jul 29, 2010, at 5:39 PM, Michael Monnerie wrote: > On Freitag, 30. Juli 2010 Eli Morris wrote: >> Is that something I could do now, or only when the filesystem is >> created? If I mount it with '-o inode64', can I mount it without >> that later, or once I write to the filesystem like that, can I not >> go back to mounting it in 32 bit mode?=20 >=20 > Once you mount with inode64, you can't go back. >=20 > I'm not sure which applications are "broken", but I use inode64 for a=20= > backup server where lots of Linux boxes connect to over NFS, and a = Samba=20 > for Windows PCs which has inode64, and at least didn't see any problem=20= > over the years. That doesn't mean there isn't a problem, of course ;-) >=20 > --=20 > mit freundlichen Gr=FCssen, > Michael Monnerie, Ing. BSc >=20 > it-management Internet Services > http://proteger.at [gesprochen: Prot-e-schee] > Tel: 0660 / 415 65 31 >=20 > ****** Aktuelles Radiointerview! ****** > http://www.it-podcast.at/aktuelle-sendung.html >=20 > // Wir haben im Moment zwei H=E4user zu verkaufen: > // http://zmi.at/langegg/ > // http://zmi.at/haus2009/ Thanks guys, That makes sense. cheers, Eli From willy@parisc-linux.org Tue Jun 8 14:15:36 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o58JFZtU020712 for ; Tue, 8 Jun 2010 14:15:36 -0500 X-ASG-Debug-ID: 1280458860-3ec003580000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.parisc-linux.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EAF07118F797 for ; Thu, 29 Jul 2010 20:01:00 -0700 (PDT) Received: from mail.parisc-linux.org (palinux.external.hp.com [192.25.206.14]) by cuda.sgi.com with ESMTP id 148Pt7dVn7fE842b for ; Thu, 29 Jul 2010 20:01:00 -0700 (PDT) Received: by mail.parisc-linux.org (Postfix, from userid 26919) id 4AC80494009; Thu, 29 Jul 2010 20:53:25 -0600 (MDT) Date: Thu, 29 Jul 2010 20:53:24 -0600 From: Matthew Wilcox To: Dave Chinner Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, sandeen@sandeen.net X-ASG-Orig-Subj: Re: [PATCH] dio: track and serialise unaligned direct IO Subject: Re: [PATCH] dio: track and serialise unaligned direct IO Message-ID: <20100730025324.GO25774@parisc-linux.org> References: <1280443516-14448-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1280443516-14448-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: palinux.external.hp.com[192.25.206.14] X-Barracuda-Start-Time: 1280458860 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36487 Rule breakdown below pts rule 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, Jul 30, 2010 at 08:45:16AM +1000, Dave Chinner wrote: > If we get two unaligned direct IO's to the same filesystem block > that is marked as a new allocation (i.e. buffer_new), then both IOs will > zero the portion of the block they are not writing data to. As a > result, when the IOs complete there will be a portion of the block > that contains zeros from the last IO to complete rather than the > data that should be there. Urgh. Yuck. > This is easily manifested by qemu using aio+dio with an unaligned > guest filesystem - every IO is unaligned and fileystem corruption is > encountered in the guest filesystem. xfstest 240 (from Eric Sandeen) > is also a simple reproducer. > > To avoid this problem, track unaligned IO that triggers sub-block zeroing and > check new incoming unaligned IO that require sub-block zeroing against that > list. If we get an overlap where the start and end of unaligned IOs hit the > same filesystem block, then we need to block the incoming IOs until the IO that > is zeroing the block completes. The blocked IO can then continue without > needing to do any zeroing and hence won't overwrite valid data with zeros. Urgh. Yuck. Could we perhaps handle this by making an IO instantiate a page cache page for partial writes, and forcing that portion of the IO through the page cache? The second IO would hit the same page and use the existing O_DIRECT vs page cache paths. -- Matthew Wilcox Intel Open Source Technology Centre "Bill, look, we understand that you're interested in selling us this operating system, but compare it to ours. We can't possibly take such a retrograde step." From npiggin@kernel.dk Tue Jun 8 15:22: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 o58KM8Tj023224 for ; Tue, 8 Jun 2010 15:22:08 -0500 X-ASG-Debug-ID: 1280462853-1439002a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail05.adl6.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DC9F011B1CF6 for ; Thu, 29 Jul 2010 21:07:34 -0700 (PDT) Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 6oG1FOwfY692HiFf for ; Thu, 29 Jul 2010 21:07:34 -0700 (PDT) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvsEAC/qUUx5LclT/2dsb2JhbACgGHLAIIU5BA Received: from ppp121-45-201-83.lns20.cbr1.internode.on.net (HELO laptop.local0.net) ([121.45.201.83]) by ipmail05.adl6.internode.on.net with ESMTP; 30 Jul 2010 13:29:58 +0930 Received: by laptop.local0.net (Postfix, from userid 1000) id D48B62981C; Fri, 30 Jul 2010 13:59:55 +1000 (EST) Date: Fri, 30 Jul 2010 13:59:55 +1000 From: Nick Piggin To: Dave Chinner Cc: Nick Piggin , Nick Piggin , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS hang in xlog_grant_log_space Subject: Re: XFS hang in xlog_grant_log_space Message-ID: <20100730035955.GA5271@amd> References: <20100722190100.GA22269@amd> <20100723135514.GJ32635@dastard> <20100727070538.GA2893@amd> <20100727080632.GA4958@amd> <20100727113626.GA2884@amd> <20100727133038.GP7362@dastard> <20100727145808.GQ7362@dastard> <20100728131744.GS7362@dastard> <20100729140546.GB7217@amd> <20100729225658.GM655@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100729225658.GM655@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1280462855 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36493 Rule breakdown below pts rule 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, Jul 30, 2010 at 08:56:58AM +1000, Dave Chinner wrote: > On Fri, Jul 30, 2010 at 12:05:46AM +1000, Nick Piggin wrote: > > On Wed, Jul 28, 2010 at 11:17:44PM +1000, Dave Chinner wrote: > > > Something very strange is happening, and to make matters worse I > > > cannot reproduce it with a debug kernel (ran for 3 hours without > > > failing). Hence it smells like a race condition somewhere. > > > > > > I've reproduced it without delayed logging, so it is not directly > > > related to that functionality. > > > > > > I've seen this warning: > > > > > > Filesystem "ram0": inode 0x704680 background reclaim flush failed with 117 > > > > > > Which indicates we failed to mark an inode stale when freeing an > > > inode cluster, but I think I've fixed that and the problem still > > > shows up. It's posible the last version didn't fix it, but.... > > > > I've seen that one a couple of times too. Keeps coming back each > > time you echo 3 > /proc/sys/vm/drop_caches :) > > Yup - it's an unflushable inode that is pinning the tail of the log, > hence causing the log space hangs. > > > > Now I've got the ag iterator rotor patch in place as well and > > > possibly a different version of the cluster free fix to what I > > > previously tested and it's now been running for almost half an hour. > > > I can't say yet whether I've fixed the bug of just changed the > > > timing enough to avoid it. I'll leave this test running over night > > > and redo individual patch testing tomorrow. > > > > I reproduced it with fs_stress now too. Any patches I could test > > for you just let me know. > > You should see them in a few minutes ;) It's certainly not locking up like it used to... Thanks! From SRS0+S2Ha+60+fromorbit.com=david@internode.on.net Tue Jun 8 16: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.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o58LFoOg024950 for ; Tue, 8 Jun 2010 16:15:51 -0500 X-ASG-Debug-ID: 1280465622-059600ad0000-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 53BF247C903 for ; Thu, 29 Jul 2010 21:53:42 -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 39cGioPnP3J38Wvq for ; Thu, 29 Jul 2010 21:53:42 -0700 (PDT) Received: from dastard (unverified [121.44.18.238]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33246270-1927428 for multiple; Fri, 30 Jul 2010 14:23:32 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1Oehb9-0000hB-3s; Fri, 30 Jul 2010 14:53:31 +1000 Date: Fri, 30 Jul 2010 14:53:31 +1000 From: Dave Chinner To: Matthew Wilcox Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, sandeen@sandeen.net X-ASG-Orig-Subj: Re: [PATCH] dio: track and serialise unaligned direct IO Subject: Re: [PATCH] dio: track and serialise unaligned direct IO Message-ID: <20100730045331.GA2126@dastard> References: <1280443516-14448-1-git-send-email-david@fromorbit.com> <20100730025324.GO25774@parisc-linux.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100730025324.GO25774@parisc-linux.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: 1280465624 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36496 Rule breakdown below pts rule 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, Jul 29, 2010 at 08:53:24PM -0600, Matthew Wilcox wrote: > On Fri, Jul 30, 2010 at 08:45:16AM +1000, Dave Chinner wrote: > > If we get two unaligned direct IO's to the same filesystem block > > that is marked as a new allocation (i.e. buffer_new), then both IOs will > > zero the portion of the block they are not writing data to. As a > > result, when the IOs complete there will be a portion of the block > > that contains zeros from the last IO to complete rather than the > > data that should be there. > > Urgh. Yuck. > > > This is easily manifested by qemu using aio+dio with an unaligned > > guest filesystem - every IO is unaligned and fileystem corruption is > > encountered in the guest filesystem. xfstest 240 (from Eric Sandeen) > > is also a simple reproducer. > > > > To avoid this problem, track unaligned IO that triggers sub-block zeroing and > > check new incoming unaligned IO that require sub-block zeroing against that > > list. If we get an overlap where the start and end of unaligned IOs hit the > > same filesystem block, then we need to block the incoming IOs until the IO that > > is zeroing the block completes. The blocked IO can then continue without > > needing to do any zeroing and hence won't overwrite valid data with zeros. > > Urgh. Yuck. It's better than silent data corruption. > Could we perhaps handle this by making an IO instantiate a page cache > page for partial writes, and forcing that portion of the IO through the > page cache? The second IO would hit the same page and use the existing > O_DIRECT vs page cache paths. I don't want any direct IO for XFS to go through the page cache - unaligned or not. using the page cache for the unaligned blocks would also be much worse for performance that this method because it turns unaligned direct IO into 3 IOs - the unaligned head block, the aligned body and the unaligned tail block. It would also be a performance hit you take on every single dio, whereas this way the hit is only taken when an overlap is detected. And besides, such decisions on whether to use buffered IO have to be made high up in the filesystem when we are deciding how to lock the inode for the dio - buffered IO requires exclusive locking, not the shared locking we do for dio writes. That further reduces the performance of unaligned direct IO even when there are no overlaps, and it's a solution that every filesystem needs to implement themselves in some way. I've looked at a couple of different ways to fix this (e.g. passing the unaligned state to get_blocks() to allow the filesystem to serialise there) but they've all died a horrible death of dodgy locking and hacky IO completion detection. not to mention requiring a different solution in every filesystem. This way may be a bit ugly, but it works, is isolated and seems to me to be the least-worst way of solving the problem. It could be made to scale better by making the tracking per-inode, but I don't think that growing the struct inode for this corner case is a good tradeoff, either... Cheers, Dave. -- Dave Chinner david@fromorbit.com From eflorac@intellique.com Tue Jun 8 18:49:27 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o58NnQAv030918 for ; Tue, 8 Jun 2010 18:49:26 -0500 X-ASG-Debug-ID: 1280474835-7a5b036c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp3-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8E2F616653E3 for ; Fri, 30 Jul 2010 00:27:18 -0700 (PDT) Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id kVvfiyhygYNQ7KfM for ; Fri, 30 Jul 2010 00:27:18 -0700 (PDT) Received: from galadriel.home (unknown [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id B06CF8180B5; Fri, 30 Jul 2010 09:27:10 +0200 (CEST) Date: Fri, 30 Jul 2010 09:15:54 +0200 From: Emmanuel Florac To: Eli Morris Cc: Dave Chinner , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: filesystem shrinks after using xfs_repair Subject: Re: filesystem shrinks after using xfs_repair Message-ID: <20100730091554.2c9ca1ec@galadriel.home> In-Reply-To: <04349CE2-CF8B-463C-8B06-5E4E59E869B2@ucsc.edu> References: <20100724023922.GP32635@dastard> <777100A1-57DE-4DE0-B1F0-64977BD694AD@ucsc.edu> <20100726034545.GE655@dastard> <10B6F36F-BE01-4BF7-9815-2E8F6BF71B41@ucsc.edu> <20100726060604.GF7362@dastard> <20100726102036.GH7362@dastard> <0EC8FE5D-212C-4030-9D59-FDF38DF4E9EE@ucsc.edu> <20100729230147.GN655@dastard> <04349CE2-CF8B-463C-8B06-5E4E59E869B2@ucsc.edu> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.20.1; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1280474840 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36506 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Thu, 29 Jul 2010 16:15:55 -0700 vous =C3=A9criviez: > Is that something I could do now, or only when the filesystem is > created? If I mount it with '-o inode64', can I mount it without that > later, or once I write to the filesystem like that, can I not go back > to mounting it in 32 bit mode?=20 You use inode64 at mount, however there is no return. Once you have used a filesystem with "inode64", you must use it always. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From BATV+217c815df121bef82d52+2532+infradead.org+hch@bombadil.srs.infradead.org Tue Jun 8 19:19: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 o590JtAd031899 for ; Tue, 8 Jun 2010 19:19:57 -0500 X-ASG-Debug-ID: 1280476669-0b86011b0000-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 B58B61665ED4 for ; Fri, 30 Jul 2010 00:57:49 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Rzjhi0Zks2YNgEK3 for ; Fri, 30 Jul 2010 00:57:49 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OekTS-000760-UM; Fri, 30 Jul 2010 07:57:46 +0000 Date: Fri, 30 Jul 2010 03:57:46 -0400 From: Christoph Hellwig To: Emmanuel Florac Cc: Eli Morris , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: filesystem shrinks after using xfs_repair Subject: Re: filesystem shrinks after using xfs_repair Message-ID: <20100730075746.GA20444@infradead.org> References: <20100726034545.GE655@dastard> <10B6F36F-BE01-4BF7-9815-2E8F6BF71B41@ucsc.edu> <20100726060604.GF7362@dastard> <20100726102036.GH7362@dastard> <0EC8FE5D-212C-4030-9D59-FDF38DF4E9EE@ucsc.edu> <20100729230147.GN655@dastard> <04349CE2-CF8B-463C-8B06-5E4E59E869B2@ucsc.edu> <20100730091554.2c9ca1ec@galadriel.home> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100730091554.2c9ca1ec@galadriel.home> 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: 1280476669 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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, Jul 30, 2010 at 09:15:54AM +0200, Emmanuel Florac wrote: > > Is that something I could do now, or only when the filesystem is > > created? If I mount it with '-o inode64', can I mount it without that > > later, or once I write to the filesystem like that, can I not go back > > to mounting it in 32 bit mode? > > You use inode64 at mount, however there is no return. Once you have > used a filesystem with "inode64", you must use it always. Recent enough kernel work fine with filesystems that inode64 was used on even if it's not specified anymore. From BATV+217c815df121bef82d52+2532+infradead.org+hch@bombadil.srs.infradead.org Tue Jun 8 20:11:46 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o591BjlU034818 for ; Tue, 8 Jun 2010 20:11:46 -0500 X-ASG-Debug-ID: 1280479778-0c9303590000-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 5883A1585CA6 for ; Fri, 30 Jul 2010 01:49:38 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id g2vPWqJ8esiIJSSe for ; Fri, 30 Jul 2010 01:49:38 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OelHc-0001bT-6e; Fri, 30 Jul 2010 08:49:36 +0000 Date: Fri, 30 Jul 2010 04:49:36 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com, npiggin@kernel.de X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: unlock items before allowing the CIL to commit Subject: Re: [PATCH 1/2] xfs: unlock items before allowing the CIL to commit Message-ID: <20100730084936.GA28105@infradead.org> References: <1280444146-14540-1-git-send-email-david@fromorbit.com> <1280444146-14540-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1280444146-14540-2-git-send-email-david@fromorbit.com> 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: 1280479778 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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, Jul 30, 2010 at 08:55:45AM +1000, Dave Chinner wrote: > From: Dave Chinner > > When we commit a transaction using delayed logging, we need to > unlock the items in the transaciton before we unlock the CIL context > and allow it to be checkpointed. If we unlock them after we release > the CIl context lock, the CIL can checkpoint and complete before > we free the log items. This breaks stale buffer item unlock and > unpin processing as there is an implicit assumption that the unlock > will occur before the unpin. > > Also, some log items need to store the LSN of the transaction commit > in the item (inodes and EFIs) and so can race with other transaction > completions if we don't prevent the CIL from checkpointing before > the unlock occurs. Looks good. It also avoid keeping the items around over the CIL push, which should help with memory consumption under load. Reviewed-by: Christoph Hellwig From michael.monnerie@is.it-management.at Tue Jun 8 21:45:24 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.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 o592jNnt037740 for ; Tue, 8 Jun 2010 21:45:24 -0500 X-ASG-Debug-ID: 1280485394-2ca8038d0000-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 44160481D58 for ; Fri, 30 Jul 2010 03:23:14 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id yVfPGoC1AgKc9pPf for ; Fri, 30 Jul 2010 03:23:14 -0700 (PDT) Received: from mailsrv.i.zmi.at (h081217106033.dyn.cm.kabsi.at [81.217.106.33]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailsrv2.i.zmi.at", Issuer "power4u.zmi.at" (not verified)) by mailsrv14.zmi.at (Postfix) with ESMTPSA id 01C3D17F; Fri, 30 Jul 2010 12:23:13 +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 AED03401C33; Fri, 30 Jul 2010 12:23:12 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: filesystem shrinks after using xfs_repair Subject: Re: filesystem shrinks after using xfs_repair Date: Fri, 30 Jul 2010 12:23:08 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.34.1-zmi; KDE/4.3.5; x86_64; ; ) Cc: Christoph Hellwig References: <20100726034545.GE655@dastard> <20100730091554.2c9ca1ec@galadriel.home> <20100730075746.GA20444@infradead.org> In-Reply-To: <20100730075746.GA20444@infradead.org> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1753717.5qSE4ucyiU"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201007301223.12134@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1280485395 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36518 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --nextPart1753717.5qSE4ucyiU Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Freitag, 30. Juli 2010 Christoph Hellwig wrote: > Recent enough kernel work fine with filesystems that inode64 was used > on even if it's not specified anymore. =20 Really? Since when exactly? That would be a nice feature. If we can=20 define it clearly, I could put that on the FAQ. But how does it truncate the numbers >int32 and avoid collisions? =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 ****** Aktuelles Radiointerview! ****** http://www.it-podcast.at/aktuelle-sendung.html // Wir haben im Moment zwei H=E4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart1753717.5qSE4ucyiU 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) iEYEABECAAYFAkxSqBAACgkQzhSR9xwSCbT4kACg3UTEKeWmW8uUAXCMnGO1haDP bm4AoJ6ufW6GdLQEmek/iddPIyh2RMNY =5cTA -----END PGP SIGNATURE----- --nextPart1753717.5qSE4ucyiU-- From BATV+217c815df121bef82d52+2532+infradead.org+hch@bombadil.srs.infradead.org Tue Jun 8 21:49:55 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o592nsNW037874 for ; Tue, 8 Jun 2010 21:49:55 -0500 X-ASG-Debug-ID: 1280485668-58cc01420000-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 82191481D7B for ; Fri, 30 Jul 2010 03:27:48 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id n3FjA2jUdFQCMn3v for ; Fri, 30 Jul 2010 03:27:48 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1Oemoc-0006Gk-TB; Fri, 30 Jul 2010 10:27:46 +0000 Date: Fri, 30 Jul 2010 06:27:46 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com, npiggin@kernel.de X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: ensure we mark all inodes in a freed cluster XFS_ISTALE Subject: Re: [PATCH 2/2] xfs: ensure we mark all inodes in a freed cluster XFS_ISTALE Message-ID: <20100730102746.GA10367@infradead.org> References: <1280444146-14540-1-git-send-email-david@fromorbit.com> <1280444146-14540-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1280444146-14540-3-git-send-email-david@fromorbit.com> 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: 1280485668 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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, Jul 30, 2010 at 08:55:46AM +1000, Dave Chinner wrote: > From: Dave Chinner > > Under heavy load parallel metadata loads (e.g. dbench), we can fail > to mark all the inodes in a cluster being freed as XFS_ISTALE as we > skip inodes we cannot get the XFS_ILOCK_EXCL or the flush lock on. > When this happens and the inode cluster buffer has already been > marked stale and freed, inode reclaim can try to write the inode out > as it is dirty and not marked stale. This can result in writing th > metadata to an freed extent, or in the case it has already > been overwritten trigger a magic number check failure and return an > EUCLEAN error such as: > > Filesystem "ram0": inode 0x442ba1 background reclaim flush failed with 117 > > Fix this by ensuring that we hoover up all in memory inodes in the > cluster and mark them XFS_ISTALE when freeing the cluster. Why do you move the loop over the log items around? From all that I can see the original place is much better as we just have to loop over the items once. Then once we look up the inodes in memory we skip over the inodes that already are stale, so the behaviour should be the same. Also instead of the i-- and continue for the lock failure an explicit goto retry would make it a lot more obvious. The actual change of not skipping inodes looks good to me. From BATV+217c815df121bef82d52+2532+infradead.org+hch@bombadil.srs.infradead.org Tue Jun 8 21:51: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 o592po1R037938 for ; Tue, 8 Jun 2010 21:51:51 -0500 X-ASG-Debug-ID: 1280486239-0667019d0000-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 77ACB13357D8 for ; Fri, 30 Jul 2010 03:37:19 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id toM1WCI60NNsNCLR for ; Fri, 30 Jul 2010 03:37:19 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OemqV-0006KK-Fb; Fri, 30 Jul 2010 10:29:43 +0000 Date: Fri, 30 Jul 2010 06:29:43 -0400 From: Christoph Hellwig To: Michael Monnerie Cc: xfs@oss.sgi.com, Christoph Hellwig X-ASG-Orig-Subj: Re: filesystem shrinks after using xfs_repair Subject: Re: filesystem shrinks after using xfs_repair Message-ID: <20100730102943.GA24106@infradead.org> References: <20100726034545.GE655@dastard> <20100730091554.2c9ca1ec@galadriel.home> <20100730075746.GA20444@infradead.org> <201007301223.12134@zmi.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201007301223.12134@zmi.at> 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: 1280486240 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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, Jul 30, 2010 at 12:23:08PM +0200, Michael Monnerie wrote: > On Freitag, 30. Juli 2010 Christoph Hellwig wrote: > > Recent enough kernel work fine with filesystems that inode64 was used > > on even if it's not specified anymore. > > Really? Since when exactly? That would be a nice feature. If we can > define it clearly, I could put that on the FAQ. Linux 2.6.35 will be the first kernel with the bugfixes for this to work. > But how does it truncate the numbers >int32 and avoid collisions? It doesn't. Existing inodes won't nessecarily fit into 32-bits, but no new inodes above it will be allocated. From SRS0+Z1Mn+60+fromorbit.com=david@internode.on.net Tue Jun 8 22:16:17 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o593GGop038777 for ; Tue, 8 Jun 2010 22:16:17 -0500 X-ASG-Debug-ID: 1280487248-63b801800000-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 0EE09166D7EC for ; Fri, 30 Jul 2010 03:54:08 -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 WmhOH4CtLflCoDVj for ; Fri, 30 Jul 2010 03:54:08 -0700 (PDT) Received: from dastard (unverified [121.44.18.238]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33266135-1927428 for multiple; Fri, 30 Jul 2010 20:24:05 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1OenE4-00012A-9w; Fri, 30 Jul 2010 20:54:04 +1000 Date: Fri, 30 Jul 2010 20:54:04 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com, npiggin@kernel.de X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: ensure we mark all inodes in a freed cluster XFS_ISTALE Subject: Re: [PATCH 2/2] xfs: ensure we mark all inodes in a freed cluster XFS_ISTALE Message-ID: <20100730105404.GB2126@dastard> References: <1280444146-14540-1-git-send-email-david@fromorbit.com> <1280444146-14540-3-git-send-email-david@fromorbit.com> <20100730102746.GA10367@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100730102746.GA10367@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: 1280487250 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36520 Rule breakdown below pts rule 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, Jul 30, 2010 at 06:27:46AM -0400, Christoph Hellwig wrote: > On Fri, Jul 30, 2010 at 08:55:46AM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > Under heavy load parallel metadata loads (e.g. dbench), we can fail > > to mark all the inodes in a cluster being freed as XFS_ISTALE as we > > skip inodes we cannot get the XFS_ILOCK_EXCL or the flush lock on. > > When this happens and the inode cluster buffer has already been > > marked stale and freed, inode reclaim can try to write the inode out > > as it is dirty and not marked stale. This can result in writing th > > metadata to an freed extent, or in the case it has already > > been overwritten trigger a magic number check failure and return an > > EUCLEAN error such as: > > > > Filesystem "ram0": inode 0x442ba1 background reclaim flush failed with 117 > > > > Fix this by ensuring that we hoover up all in memory inodes in the > > cluster and mark them XFS_ISTALE when freeing the cluster. > > Why do you move the loop over the log items around? From all that > I can see the original place is much better as we just have to loop > over the items once. Then once we look up the inodes in memory > we skip over the inodes that already are stale, so the behaviour > should be the same. You are right - it is doing the same as the old code where it is marking them stale first. I rearranged some code when trying a couple of crazy ideas, but forgot to move it back when I had somethign that fixed the bug. I'll move it back - that shoul dmake the diff lots smaller. > Also instead of the i-- and continue for the > lock failure an explicit goto retry would make it a lot more obvious. Good point. I fix it up and test it again. Cheers, Dave. -- Dave Chinner david@fromorbit.com From michael.monnerie@is.it-management.at Wed Jun 9 00:02:25 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5952O7b044613 for ; Wed, 9 Jun 2010 00:02:25 -0500 X-ASG-Debug-ID: 1280493616-76a9002f0000-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 EEA5B4824DD for ; Fri, 30 Jul 2010 05:40:16 -0700 (PDT) Received: from mailsrv14.zmi.at (mailsrv1.zmi.at [212.69.164.54]) by cuda.sgi.com with ESMTP id qIzVW50rethJ6SOJ for ; Fri, 30 Jul 2010 05:40: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 119F1422; Fri, 30 Jul 2010 14:40:15 +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 B077D401C33; Fri, 30 Jul 2010 14:40:14 +0200 (CEST) From: Michael Monnerie Organization: it-management http://it-management.at To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: filesystem shrinks after using xfs_repair Subject: Re: filesystem shrinks after using xfs_repair Date: Fri, 30 Jul 2010 14:40:13 +0200 User-Agent: KMail/1.12.4 (Linux/2.6.34.1-zmi; KDE/4.3.5; x86_64; ; ) Cc: Christoph Hellwig References: <20100726034545.GE655@dastard> <201007301223.12134@zmi.at> <20100730102943.GA24106@infradead.org> In-Reply-To: <20100730102943.GA24106@infradead.org> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart1995857.AVg1TNjj4R"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201007301440.14195@zmi.at> X-Barracuda-Connect: mailsrv1.zmi.at[212.69.164.54] X-Barracuda-Start-Time: 1280493616 X-Barracuda-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.36526 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 --nextPart1995857.AVg1TNjj4R Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Freitag, 30. Juli 2010 Christoph Hellwig wrote: > On Fri, Jul 30, 2010 at 12:23:08PM +0200, Michael Monnerie wrote: > > On Freitag, 30. Juli 2010 Christoph Hellwig wrote: > > > Recent enough kernel work fine with filesystems that inode64 was > > > used on even if it's not specified anymore. > > > > =20 > > Really? Since when exactly? That would be a nice feature. If we > > can define it clearly, I could put that on the FAQ. >=20 > Linux 2.6.35 will be the first kernel with the bugfixes for this to > work. Hihi, *rofl*. That's what developers mean by "recent enough kernel": It=20 will be "in the next release to come". :-) > > But how does it truncate the numbers >int32 and avoid collisions? >=20 > It doesn't. Existing inodes won't nessecarily fit into 32-bits, but > no new inodes above it will be allocated. OK, sounds simple. I wrote two new FAQ entries: http://xfs.org/index.php/XFS_FAQ#Q:_What_is_the_inode64_mount_option_for.3F Could "all who know better than me" please verify if the information is=20 correct? =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 ****** Aktuelles Radiointerview! ****** http://www.it-podcast.at/aktuelle-sendung.html // Wir haben im Moment zwei H=E4user zu verkaufen: // http://zmi.at/langegg/ // http://zmi.at/haus2009/ --nextPart1995857.AVg1TNjj4R 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) iEYEABECAAYFAkxSyC4ACgkQzhSR9xwSCbS1ngCdHiLDPnvYF3I74+dG3trleuSc 3nQAoJH/jWBXwXTds9OHDnrEuIVOmF7r =BTn9 -----END PGP SIGNATURE----- --nextPart1995857.AVg1TNjj4R-- From eflorac@intellique.com Wed Jun 9 00:39:28 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o595dS8K046674 for ; Wed, 9 Jun 2010 00:39:28 -0500 X-ASG-Debug-ID: 1280495835-123d00ab0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp4-g21.free.fr (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id ED33E1E3717E for ; Fri, 30 Jul 2010 06:17:19 -0700 (PDT) Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id 285vFaRpFLmzBFu5 for ; Fri, 30 Jul 2010 06:17:19 -0700 (PDT) Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id 29A584C80A5; Fri, 30 Jul 2010 15:17:10 +0200 (CEST) Date: Fri, 30 Jul 2010 15:17:16 +0200 From: Emmanuel Florac To: Christoph Hellwig Cc: Michael Monnerie , Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: filesystem shrinks after using xfs_repair Subject: Re: filesystem shrinks after using xfs_repair Message-ID: <20100730151716.3a075ef8@harpe.intellique.com> In-Reply-To: <20100730102943.GA24106@infradead.org> References: <20100726034545.GE655@dastard> <20100730091554.2c9ca1ec@galadriel.home> <20100730075746.GA20444@infradead.org> <201007301223.12134@zmi.at> <20100730102943.GA24106@infradead.org> Organization: Intellique X-Mailer: Claws Mail 3.7.3 (GTK+ 2.16.6; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1280495841 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36528 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Le Fri, 30 Jul 2010 06:29:43 -0400 Christoph Hellwig =E9crivait: > Linux 2.6.35 will be the first kernel with the bugfixes for this to > work. Then it's hardly a feature we may count on for a while :) --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From pbadari@gmail.com Wed Jun 9 05:05:08 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,FREEMAIL_FROM, J_CHICKENPOX_33,J_CHICKENPOX_63 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 o59A58Mx058419 for ; Wed, 9 Jun 2010 05:05:08 -0500 X-ASG-Debug-ID: 1280511780-5b30011c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from e34.co.us.ibm.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7FAE6483B47 for ; Fri, 30 Jul 2010 10:43:00 -0700 (PDT) Received: from e34.co.us.ibm.com (e34.co.us.ibm.com [32.97.110.152]) by cuda.sgi.com with ESMTP id xVdbu4SQM5l9W9Oq for ; Fri, 30 Jul 2010 10:43:00 -0700 (PDT) Received: from d03relay01.boulder.ibm.com (d03relay01.boulder.ibm.com [9.17.195.226]) by e34.co.us.ibm.com (8.14.4/8.13.1) with ESMTP id o6UHYMxh019639 for ; Fri, 30 Jul 2010 11:34:22 -0600 Received: from d03av04.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by d03relay01.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o6UHggu9120988 for ; Fri, 30 Jul 2010 11:42:42 -0600 Received: from d03av04.boulder.ibm.com (loopback [127.0.0.1]) by d03av04.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id o6UHgbkx008325 for ; Fri, 30 Jul 2010 11:42:37 -0600 Received: from [9.47.17.100] (badari-desktop.beaverton.ibm.com [9.47.17.100]) by d03av04.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id o6UHgaKF008287; Fri, 30 Jul 2010 11:42:36 -0600 X-ASG-Orig-Subj: Re: [PATCH] dio: track and serialise unaligned direct IO Subject: Re: [PATCH] dio: track and serialise unaligned direct IO From: Badari Pulavarty To: Dave Chinner Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, sandeen@sandeen.net In-Reply-To: <1280443516-14448-1-git-send-email-david@fromorbit.com> References: <1280443516-14448-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=utf-8 Date: Fri, 30 Jul 2010 10:43:09 -0700 Message-Id: <1280511789.16484.18.camel@badari-desktop> Mime-Version: 1.0 X-Mailer: Evolution 2.22.3.1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: e34.co.us.ibm.com[32.97.110.152] X-Barracuda-Start-Time: 1280511781 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36546 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, 2010-07-30 at 08:45 +1000, Dave Chinner wrote: > From: Dave Chinner > > If we get two unaligned direct IO's to the same filesystem block > that is marked as a new allocation (i.e. buffer_new), then both IOs will > zero the portion of the block they are not writing data to. As a > result, when the IOs complete there will be a portion of the block > that contains zeros from the last IO to complete rather than the > data that should be there. > > This is easily manifested by qemu using aio+dio with an unaligned > guest filesystem - every IO is unaligned and fileystem corruption is > encountered in the guest filesystem. xfstest 240 (from Eric Sandeen) > is also a simple reproducer. > > To avoid this problem, track unaligned IO that triggers sub-block zeroing and > check new incoming unaligned IO that require sub-block zeroing against that > list. If we get an overlap where the start and end of unaligned IOs hit the > same filesystem block, then we need to block the incoming IOs until the IO that > is zeroing the block completes. The blocked IO can then continue without > needing to do any zeroing and hence won't overwrite valid data with zeros. > > Signed-off-by: Dave Chinner I can confirm that, it fixes corruption of my VM images when using AIO +DIO. (cache=none,aio=native). I haven't reviewed the patch closely, but 1) can we do this only for AIO+DIO combination ? For regular DIO, we should have all the IOs serialized by i_mutex anyway.. 2) Having a single global list (for all devices) might cause scaling issues. 3) Are you dropping i_mutex when you are waiting for the zero-out to finish ? Thanks, Badari > --- > fs/direct-io.c | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- > 1 files changed, 146 insertions(+), 6 deletions(-) > > diff --git a/fs/direct-io.c b/fs/direct-io.c > index a10cb91..611524e 100644 > --- a/fs/direct-io.c > +++ b/fs/direct-io.c > @@ -71,6 +71,9 @@ struct dio { > unsigned start_zero_done; /* flag: sub-blocksize zeroing has > been performed at the start of a > write */ > +#define LAST_SECTOR ((sector_t)-1LL) > + sector_t zero_block_front; /* fs block we are zeroing at front */ > + sector_t zero_block_rear; /* fs block we are zeroing at rear */ > int pages_in_io; /* approximate total IO pages */ > size_t size; /* total request size (doesn't change)*/ > sector_t block_in_file; /* Current offset into the underlying > @@ -135,6 +138,101 @@ struct dio { > struct page *pages[DIO_PAGES]; /* page buffer */ > }; > > + > +/* > + * record fs blocks we are doing zeroing on in a zero block list. > + * unaligned IO is not very performant and so is relatively uncommon, > + * so a global list should be sufficent to track them. > + */ > +struct dio_zero_block { > + struct list_head dio_list; /* list of io in progress */ > + sector_t zero_block; /* block being zeroed */ > + struct dio *dio; /* owner dio */ > + wait_queue_head_t wq; /* New IO block here */ > + atomic_t ref; /* reference count */ > +}; > + > +DEFINE_SPINLOCK(dio_zero_block_lock); > +LIST_HEAD(dio_zero_block_list); > + > +/* > + * Add a filesystem block to the list of blocks we are tracking. > + */ > +static void > +dio_start_zero_block(struct dio *dio, sector_t zero_block) > +{ > + struct dio_zero_block *zb; > + > + zb = kmalloc(sizeof(*zb), GFP_NOIO); > + if (!zb) > + return; > + INIT_LIST_HEAD(&zb->dio_list); > + init_waitqueue_head(&zb->wq); > + zb->zero_block = zero_block; > + zb->dio = dio; > + atomic_set(&zb->ref, 1); > + > + spin_lock(&dio_zero_block_lock); > + list_add(&zb->dio_list, &dio_zero_block_list); > + spin_unlock(&dio_zero_block_lock); > +} > + > +static void > +dio_drop_zero_block(struct dio_zero_block *zb) > +{ > + if (atomic_dec_and_test(&zb->ref)) > + kfree(zb); > +} > + > +/* > + * Check whether a filesystem block is currently being zeroed, and if it is > + * wait for it to complete before returning. If we waited for a block being > + * zeroed, return 1 to indicate that the block is already initialised, > + * otherwise return 0 to indicate that it needs zeroing. > + */ > +static int > +dio_wait_zero_block(struct dio *dio, sector_t zero_block) > +{ > + struct dio_zero_block *zb; > + > + spin_lock(&dio_zero_block_lock); > + list_for_each_entry(zb, &dio_zero_block_list, dio_list) { > + if (zb->dio->inode != dio->inode) > + continue; > + if (zb->zero_block != zero_block) > + continue; > + atomic_inc(&zb->ref); > + spin_unlock(&dio_zero_block_lock); > + wait_event(zb->wq, (list_empty(&zb->dio_list))); > + dio_drop_zero_block(zb); > + return 1; > + } > + spin_unlock(&dio_zero_block_lock); > + return 0; > +} > + > +/* > + * Complete a block zeroing and wake up anyone waiting for it. > + */ > +static void dio_end_zero_block(struct dio *dio, sector_t zero_block) > +{ > + struct dio_zero_block *zb; > + > + spin_lock(&dio_zero_block_lock); > + list_for_each_entry(zb, &dio_zero_block_list, dio_list) { > + if (zb->dio->inode != dio->inode) > + continue; > + if (zb->zero_block != zero_block) > + continue; > + list_del_init(&zb->dio_list); > + spin_unlock(&dio_zero_block_lock); > + wake_up(&zb->wq); > + dio_drop_zero_block(zb); > + return; > + } > + spin_unlock(&dio_zero_block_lock); > +} > + > /* > * How many pages are in the queue? > */ > @@ -253,6 +351,11 @@ static int dio_complete(struct dio *dio, loff_t offset, int ret, bool is_async) > aio_complete(dio->iocb, ret, 0); > } > > + if (dio->zero_block_front != LAST_SECTOR) > + dio_end_zero_block(dio, dio->zero_block_front); > + if (dio->zero_block_rear != LAST_SECTOR) > + dio_end_zero_block(dio, dio->zero_block_rear); > + > if (dio->flags & DIO_LOCKING) > /* lockdep: non-owner release */ > up_read_non_owner(&dio->inode->i_alloc_sem); > @@ -777,6 +880,12 @@ static void clean_blockdev_aliases(struct dio *dio) > * block with zeros. This happens only if user-buffer, fileoffset or > * io length is not filesystem block-size multiple. > * > + * We need to track the blocks we are zeroing. If we have concurrent IOs that hit > + * the same start or end block, we do not want all the IOs to zero the portion > + * they are not writing data to as that will overwrite data from the other IOs. > + * Hence we need to block until the first unaligned IO completes before we can > + * continue (without executing any zeroing). > + * > * `end' is zero if we're doing the start of the IO, 1 at the end of the > * IO. > */ > @@ -784,8 +893,8 @@ static void dio_zero_block(struct dio *dio, int end) > { > unsigned dio_blocks_per_fs_block; > unsigned this_chunk_blocks; /* In dio_blocks */ > - unsigned this_chunk_bytes; > struct page *page; > + sector_t fsblock; > > dio->start_zero_done = 1; > if (!dio->blkfactor || !buffer_new(&dio->map_bh)) > @@ -797,17 +906,41 @@ static void dio_zero_block(struct dio *dio, int end) > if (!this_chunk_blocks) > return; > > + if (end) > + this_chunk_blocks = dio_blocks_per_fs_block - this_chunk_blocks; > + > /* > * We need to zero out part of an fs block. It is either at the > - * beginning or the end of the fs block. > + * beginning or the end of the fs block, but first we need to check if > + * there is already a zeroing being run on this block. > + * > + * If we are doing a sub-block IO (i.e. zeroing both front and rear of > + * the same block) we don't need to wait or set a gaurd for the rear of > + * the block as we already have one set. > */ > - if (end) > - this_chunk_blocks = dio_blocks_per_fs_block - this_chunk_blocks; > + fsblock = dio->block_in_file >> dio->blkfactor; > + if (!end || dio->zero_block_front != fsblock) { > > - this_chunk_bytes = this_chunk_blocks << dio->blkbits; > + /* wait for any zeroing already in progress */ > + if (dio_wait_zero_block(dio, fsblock)) { > + /* skip the range we would have zeroed. */ > + dio->next_block_for_io += this_chunk_blocks; > + return; > + } > + > + /* > + * we are going to zero stuff now, so set a guard to catch > + * others that might want to zero the same block. > + */ > + dio_start_zero_block(dio, fsblock); > + if (end) > + dio->zero_block_rear = fsblock; > + else > + dio->zero_block_front = fsblock; > + } > > page = ZERO_PAGE(0); > - if (submit_page_section(dio, page, 0, this_chunk_bytes, > + if (submit_page_section(dio, page, 0, this_chunk_blocks << dio->blkbits, > dio->next_block_for_io)) > return; > > @@ -1191,6 +1324,13 @@ __blockdev_direct_IO_newtrunc(int rw, struct kiocb *iocb, struct inode *inode, > */ > memset(dio, 0, offsetof(struct dio, pages)); > > + /* > + * zero_blocks need to initialised to largeѕt value to avoid > + * matching the zero block accidentally. > + */ > + dio->zero_block_front = LAST_SECTOR; > + dio->zero_block_rear = LAST_SECTOR; > + > dio->flags = flags; > if (dio->flags & DIO_LOCKING) { > /* watch out for a 0 len io from a tricksy fs */ > -- > 1.7.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From aelder@sgi.com Wed Jun 9 09:07:55 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_63, J_CHICKENPOX_65,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o59E7sF4068120 for ; Wed, 9 Jun 2010 09:07:55 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay1.corp.sgi.com (Postfix) with ESMTP id 891E18F804B for ; Fri, 30 Jul 2010 14:45:46 -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 o6ULjkMY008061 for ; Fri, 30 Jul 2010 16:45:46 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o6ULjk4v008060 for xfs@oss.sgi.com; Fri, 30 Jul 2010 16:45:46 -0500 From: Alex Elder Message-Id: <201007302145.o6ULjk4v008060@stout.americas.sgi.com> Date: Fri, 30 Jul 2010 16:45:45 -0500 To: xfs@oss.sgi.com Subject: [PATCH] xfsprogs: fix depend targets User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean There's no need to re-make the dependency files all the time. Make it so the "depend" target rebuilds the ".dep" file only if necessary. Also change the name of the dependency file created for "ltdepend" to be ".ltdep". Signed-off-by: Alex Elder --- Makefile | 6 +++--- include/buildrules | 14 +++++++++----- libdisk/Makefile | 2 +- libhandle/Makefile | 2 +- libxcmd/Makefile | 2 +- libxfs/Makefile | 2 +- libxlog/Makefile | 2 +- 7 files changed, 17 insertions(+), 13 deletions(-) Index: b/Makefile =================================================================== --- a/Makefile +++ b/Makefile @@ -30,9 +30,9 @@ SRCTAR = $(PKG_NAME)-$(PKG_VERSION).tar. CONFIGURE = aclocal.m4 configure config.guess config.sub install-sh ltmain.sh LSRCFILES = configure.in release.sh README VERSION $(CONFIGURE) -LDIRT = config.log .dep config.status config.cache confdefs.h conftest* \ - built .census install.* install-dev.* *.gz autom4te.cache/* libtool \ - include/builddefs include/platform_defs.h +LDIRT = config.log .ltdep .dep config.status config.cache confdefs.h \ + conftest* built .census install.* install-dev.* *.gz \ + autom4te.cache/* libtool include/builddefs include/platform_defs.h ifeq ($(HAVE_BUILDDEFS), yes) LDIRDIRT = $(SRCDIR) Index: b/include/buildrules =================================================================== --- a/include/buildrules +++ b/include/buildrules @@ -7,7 +7,7 @@ _BUILDRULES_INCLUDED_ = 1 include $(TOPDIR)/include/builddefs clean clobber : $(addsuffix -clean,$(SUBDIRS)) - @rm -f $(DIRT) .dep + @rm -f $(DIRT) .ltdep .dep @rm -fr $(DIRDIRT) %-clean: @echo "Cleaning $*" @@ -94,10 +94,14 @@ $(_FORCE): MAKEDEP := $(MAKEDEPEND) $(CFLAGS) -ltdepend: $(CFILES) $(HFILES) - @echo " [DEP]" - $(Q)$(MAKEDEP) $(CFILES) | $(SED) -e 's,^\([^:]*\)\.o,\1.lo,' > .dep +ltdepend: .ltdep + +.ltdep: $(CFILES) $(HFILES) + @echo " [LTDEP]" + $(Q)$(MAKEDEP) $(CFILES) | $(SED) -e 's,^\([^:]*\)\.o,\1.lo,' > .ltdep + +depend: .dep -depend: $(CFILES) $(HFILES) +.dep: $(CFILES) $(HFILES) @echo " [DEP]" $(Q)$(MAKEDEP) $(CFILES) > .dep Index: b/libdisk/Makefile =================================================================== --- a/libdisk/Makefile +++ b/libdisk/Makefile @@ -30,4 +30,4 @@ install-dev: default install-qa: install-dev --include .dep +-include .ltdep Index: b/libhandle/Makefile =================================================================== --- a/libhandle/Makefile +++ b/libhandle/Makefile @@ -27,4 +27,4 @@ install-dev: default install-qa: install-dev --include .dep +-include .ltdep Index: b/libxcmd/Makefile =================================================================== --- a/libxcmd/Makefile +++ b/libxcmd/Makefile @@ -34,4 +34,4 @@ include $(BUILDRULES) install install-dev install-qa: default --include .dep +-include .ltdep Index: b/libxfs/Makefile =================================================================== --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -48,4 +48,4 @@ install-dev: default install-qa: default --include .dep +-include .ltdep Index: b/libxlog/Makefile =================================================================== --- a/libxlog/Makefile +++ b/libxlog/Makefile @@ -21,4 +21,4 @@ include $(BUILDRULES) install install-dev install-qa: default --include .dep +-include .ltdep From aelder@sgi.com Wed Jun 9 09:10: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.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_63, J_CHICKENPOX_65,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o59EAuo1068215 for ; Wed, 9 Jun 2010 09:10:56 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay2.corp.sgi.com (Postfix) with ESMTP id EFF163040C8 for ; Fri, 30 Jul 2010 14:48:47 -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 o6ULmlbT008273 for ; Fri, 30 Jul 2010 16:48:47 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o6ULmlpA008272 for xfs@oss.sgi.com; Fri, 30 Jul 2010 16:48:47 -0500 From: Alex Elder Message-Id: <201007302148.o6ULmlpA008272@stout.americas.sgi.com> Date: Fri, 30 Jul 2010 16:48:47 -0500 To: xfs@oss.sgi.com Subject: [PATCH] xfsdump: fix depend targets User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean There's no need to re-make the dependency files all the time. Make it so the "depend" target rebuilds the ".dep" file only if necessary. Also change the name of the dependency file created for "ltdepend" to be ".ltdep". Signed-off-by: Alex Elder --- Makefile | 6 +++--- dump/Makefile | 2 +- include/buildrules | 16 ++++++++++------ inventory/Makefile | 2 +- librmt/Makefile | 2 +- restore/Makefile | 2 +- 6 files changed, 17 insertions(+), 13 deletions(-) Index: b/Makefile =================================================================== --- a/Makefile +++ b/Makefile @@ -30,9 +30,9 @@ SRCTAR = $(PKG_NAME)-$(PKG_VERSION).tar. CONFIGURE = aclocal.m4 configure config.guess config.sub install-sh ltmain.sh LSRCFILES = configure.in release.sh README VERSION $(CONFIGURE) -LDIRT = config.log .dep config.status config.cache confdefs.h conftest* \ - built .census install.* install-dev.* *.gz autom4te.cache/* libtool \ - include/builddefs include/config.h +LDIRT = config.log .ltdep .dep config.status config.cache confdefs.h \ + conftest* built .census install.* install-dev.* *.gz \ + autom4te.cache/* libtool include/builddefs include/config.h ifeq ($(HAVE_BUILDDEFS), yes) LDIRDIRT = $(SRCDIR) Index: b/dump/Makefile =================================================================== --- a/dump/Makefile +++ b/dump/Makefile @@ -105,7 +105,7 @@ install: default $(INSTALL) -S $(PKG_ROOT_SBIN_DIR)/$(LTCOMMAND) $(PKG_SBIN_DIR)/$(LTCOMMAND) install-dev: -depend: $(COMMINCL) $(COMMON) $(INVINCL) $(INVCOMMON) +.dep: $(COMMINCL) $(COMMON) $(INVINCL) $(INVCOMMON) $(COMMINCL) $(COMMON): @echo " [LN] $@" Index: b/include/buildrules =================================================================== --- a/include/buildrules +++ b/include/buildrules @@ -7,7 +7,7 @@ _BUILDRULES_INCLUDED_ = 1 include $(TOPDIR)/include/builddefs clean clobber : $(addsuffix -clean,$(SUBDIRS)) - @rm -f $(DIRT) .dep + @rm -f $(DIRT) .ltdep .dep @rm -fr $(DIRDIRT) %-clean: @echo "Cleaning $*" @@ -94,10 +94,14 @@ $(_FORCE): MAKEDEP := $(MAKEDEPEND) $(CFLAGS) -ltdepend: $(CFILES) $(HFILES) - @echo " [DEP]" - $(Q)$(MAKEDEP) $(CFILES) | $(SED) -e 's,^\([^:]*\)\.o,\1.lo,' > .dep +ltdepend: .ltdep + +.ltdep: $(CFILES) $(HFILES) + @echo " [LTDEP]" + $(Q)$(MAKEDEP) $(CFILES) | $(SED) -e 's,^\([^:]*\)\.o,\1.lo,' > .ltdep + +depend: .dep -depend: $(CFILES) $(HFILES) +.dep: $(CFILES) $(HFILES) @echo " [DEP]" - $(Q)$(MAKEDEP) $(CFILES) > .dep + $(Q)[ -n "$(CFILES)" ] && $(MAKEDEP) $(CFILES) > .dep Index: b/inventory/Makefile =================================================================== --- a/inventory/Makefile +++ b/inventory/Makefile @@ -13,4 +13,4 @@ default install install-dev: include $(BUILDRULES) --include .dep +-include .ltdep Index: b/librmt/Makefile =================================================================== --- a/librmt/Makefile +++ b/librmt/Makefile @@ -21,4 +21,4 @@ include $(BUILDRULES) install install-dev: default --include .dep +-include .ltdep Index: b/restore/Makefile =================================================================== --- a/restore/Makefile +++ b/restore/Makefile @@ -117,7 +117,7 @@ install: default $(INSTALL) -S $(PKG_ROOT_SBIN_DIR)/$(LTCOMMAND) $(PKG_SBIN_DIR)/$(LTCOMMAND) install-dev: -depend: $(COMMINCL) $(COMMON) $(INVINCL) $(INVCOMMON) +.dep: $(COMMINCL) $(COMMON) $(INVINCL) $(INVCOMMON) $(COMMINCL) $(COMMON): @echo " [LN] $@" From aelder@sgi.com Wed Jun 9 09:11: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.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_54, J_CHICKENPOX_65,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o59EBsL9068255 for ; Wed, 9 Jun 2010 09:11:54 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay1.corp.sgi.com (Postfix) with ESMTP id BD6CA8F80A1 for ; Fri, 30 Jul 2010 14:49:48 -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 o6ULnmtd008331 for ; Fri, 30 Jul 2010 16:49:48 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o6ULnmTR008330 for xfs@oss.sgi.com; Fri, 30 Jul 2010 16:49:48 -0500 From: Alex Elder Message-Id: <201007302149.o6ULnmTR008330@stout.americas.sgi.com> Date: Fri, 30 Jul 2010 16:49:48 -0500 To: xfs@oss.sgi.com Subject: [PATCH] xfstests: fix depend targets User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean There's no need to re-make the dependency files all the time. Make it so the "depend" target rebuilds the ".dep" file only if necessary. Also change the name of the dependency file created for "ltdepend" to be ".ltdep". Signed-off-by: Alex Elder --- Makefile | 4 ++-- include/buildrules | 18 ++++++++++++------ lib/Makefile | 2 +- 3 files changed, 15 insertions(+), 9 deletions(-) Index: b/Makefile =================================================================== --- a/Makefile +++ b/Makefile @@ -27,8 +27,8 @@ endif TESTS = $(shell sed -n -e '/^[0-9][0-9][0-9]*/s/ .*//p' group) CONFIGURE = configure include/builddefs include/config.h LSRCFILES = configure configure.in aclocal.m4 README VERSION -LDIRT = config.log .dep config.status config.cache confdefs.h conftest* \ - check.log check.time +LDIRT = config.log .ltdep .dep config.status config.cache confdefs.h \ + conftest* check.log check.time ifeq ($(HAVE_DMAPI), true) DMAPI_MAKEFILE = dmapi/Makefile Index: b/include/buildrules =================================================================== --- a/include/buildrules +++ b/include/buildrules @@ -8,7 +8,7 @@ include $(TOPDIR)/include/builddefs clean clobber : $(addsuffix -clean,$(SUBDIRS)) $(Q)rm -f $(DIRT) - $(Q)rm -fr .libs .dep + $(Q)rm -fr .libs .ltdep .dep %-clean: @echo "Cleaning $*" @@ -75,11 +75,17 @@ $(_FORCE): MAKEDEP := $(MAKEDEPEND) $(CFLAGS) -ltdepend: $(CFILES) $(HFILES) - @echo " [DEP]" - $(Q)$(MAKEDEP) $(CFILES) | $(SED) -e 's,^\([^:]*\)\.o,\1.lo,' > .dep +ltdepend: .ltdep + +.ltdep: $(CFILES) $(HFILES) + @echo " [LTDEP]" + $(Q)[ -n "$(CFILES)" ] && \ + $(MAKEDEP) $(CFILES) | $(SED) -e 's,^\([^:]*\)\.o,\1.lo,' > .ltdep + +depend: .dep -depend: $(CFILES) $(HFILES) +.dep: $(CFILES) $(HFILES) @echo " [DEP]" - $(Q)$(MAKEDEP) $(CFILES) | $(SED) -e 's,^\([^:]*\)\.o,\1,' > .dep + $(Q)[ -n "$(CFILES)" ] && \ + $(MAKEDEP) $(CFILES) | $(SED) -e 's,^\([^:]*\)\.o,\1,' > .dep Index: b/lib/Makefile =================================================================== --- a/lib/Makefile +++ b/lib/Makefile @@ -25,4 +25,4 @@ include $(BUILDRULES) install install-dev: default --include .dep +-include .ltdep From aelder@sgi.com Wed Jun 9 09:13: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 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 o59EDSiN068302 for ; Wed, 9 Jun 2010 09:13:28 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2EBC28F8049 for ; Fri, 30 Jul 2010 14:51:23 -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 o6ULpNUF008603 for ; Fri, 30 Jul 2010 16:51:23 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o6ULpNLX008602 for xfs@oss.sgi.com; Fri, 30 Jul 2010 16:51:23 -0500 From: Alex Elder Message-Id: <201007302151.o6ULpNLX008602@stout.americas.sgi.com> Date: Fri, 30 Jul 2010 16:51:23 -0500 To: xfs@oss.sgi.com Subject: dmapi: fix depend targets User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean There's no need to re-make the dependency files all the time. Make it so the "depend" target rebuilds the ".dep" file only if necessary. Signed-off-by: Alex Elder --- include/buildrules | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) Index: b/include/buildrules =================================================================== --- a/include/buildrules +++ b/include/buildrules @@ -8,7 +8,7 @@ include $(TOPDIR)/include/builddefs clean clobber : $(addsuffix -clean,$(SUBDIRS)) rm -f $(DIRT) - @rm -fr .libs + @rm -fr .libs .dep %-clean: $(MAKE) -C $* clean @@ -72,9 +72,10 @@ ifdef LTLIBRARY DEPENDSCRIPT := $(DEPENDSCRIPT) | $(SED) -e 's,^\([^:]*\)\.o,\1.lo,' endif -depend : $(CFILES) $(HFILES) $(addsuffix -depend,$(SUBDIRS)) +depend : .dep $(addsuffix -depend,$(SUBDIRS)) + +.dep : $(CFILES) $(HFILES) $(DEPENDSCRIPT) > .dep - test -s .dep || rm -f .dep %-depend: $(MAKE) -C $* depend From aelder@sgi.com Wed Jun 9 09: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.6 required=5.0 tests=BAYES_00,J_CHICKENPOX_62, J_CHICKENPOX_64,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o59EEjLq068352 for ; Wed, 9 Jun 2010 09:14:45 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay2.corp.sgi.com (Postfix) with ESMTP id 115153040CA for ; Fri, 30 Jul 2010 14:52:40 -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 o6ULqdge008762 for ; Fri, 30 Jul 2010 16:52:39 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o6ULqdcK008761 for xfs@oss.sgi.com; Fri, 30 Jul 2010 16:52:39 -0500 From: Alex Elder Message-Id: <201007302152.o6ULqdcK008761@stout.americas.sgi.com> Date: Fri, 30 Jul 2010 16:52:39 -0500 To: xfs@oss.sgi.com Subject: [PATCH] xfstests: include NIS databases 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 If NIS is active on a test target system, additional password and group file information is available via their respective databases in NIS. Currently, some tests assume that /etc/passwd and /etc/group are the only places to find this information. This patch causes both the local database and the NIS database (if one is likely to be present) to be consulted for needed information. Signed-off-by: Alex Elder --- 093 | 2 +- common.attr | 4 ++-- common.quota | 12 ++++++------ common.rc | 28 +++++++++++++++++++++++++++- 4 files changed, 36 insertions(+), 10 deletions(-) Index: b/093 =================================================================== --- a/093 +++ b/093 @@ -72,7 +72,7 @@ echo "" file=$testdir/$seq.file user=`grep ':all=:all=' /etc/capability | tail -1 | $AWK_PROG -F: '{print $1}'` -uid=`grep $user /etc/passwd | $AWK_PROG -F: '{print $3}'` +uid=`_cat_passwd | grep $user | $AWK_PROG -F: '{print $3}'` cat >$tmp.append < 0 ) { + while ( "_cat_passwd" | getline > 0 ) { idlist[$1] = $3 } } Index: b/common.quota =================================================================== --- a/common.quota +++ b/common.quota @@ -59,11 +59,11 @@ _require_prjquota() # _require_nobody() { - grep -q '^nobody' /etc/passwd - [ $? -ne 0 ] && _notrun "/etc/passwd does not contain user nobody." + _cat_passwd | grep -q '^nobody' + [ $? -ne 0 ] && _notrun "password file does not contain user nobody." - egrep -q '^no(body|group)' /etc/group - [ $? -ne 0 ] && _notrun "/etc/group does not contain nobody/nogroup." + _cat_group | egrep -q '^no(body|group)' + [ $? -ne 0 ] && _notrun "group file does not contain nobody/nogroup." } # create a file as a specific user (uid) @@ -108,12 +108,12 @@ EOF _choose_uid() { - grep '^nobody' /etc/passwd | perl -ne '@a = split(/:/); END { printf "id=%d name=%s\n", $a[2],$a[0] }' + _cat_passwd | grep '^nobody' | perl -ne '@a = split(/:/); END { printf "id=%d name=%s\n", $a[2],$a[0] }' } _choose_gid() { - egrep '^no(body|group)' /etc/group | perl -ne '@a = split(/:/); END { printf "id=%d name=%s\n", $a[2],$a[0] }' + _cat_group | egrep '^no(body|group)' | perl -ne '@a = split(/:/); END { printf "id=%d name=%s\n", $a[2],$a[0] }' } _choose_prid() Index: b/common.rc =================================================================== --- a/common.rc +++ b/common.rc @@ -793,12 +793,38 @@ _require_nonexternal() _notrun "External device testing in progress, skipped this test" } +# indicate whether YP/NIS is active or not +# +_yp_active() +{ + local dn + dn=$(domainname 2>/dev/null) + test -n "${DN}" -a "${DN}" != "(none)" +} + +# cat the password file +# +_cat_passwd() +{ + [ _yp_active ] && ypcat passwd + cat /etc/passwd +} + +# cat the group file +# +_cat_group() +{ + [ _yp_active ] && ypcat group + cat /etc/group +} +export -f _yp_active _cat_passwd _cat_group + # check for the fsgqa user on the machine # _require_user() { qa_user=fsgqa - cat /etc/passwd | grep -q $qa_user + _cat_passwd | grep -q $qa_user [ "$?" == "0" ] || _notrun "$qa_user user not defined." } From aelder@sgi.com Wed Jun 9 09:16:32 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from 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 o59EGWRt068446 for ; Wed, 9 Jun 2010 09:16:32 -0500 Received: from stout.americas.sgi.com (stout.americas.sgi.com [128.162.232.50]) by relay3.corp.sgi.com (Postfix) with ESMTP id B0F70AC009 for ; Fri, 30 Jul 2010 14:54:23 -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 o6ULsN6t008916 for ; Fri, 30 Jul 2010 16:54:23 -0500 Received: (from aelder@localhost) by stout.americas.sgi.com (8.14.3/8.14.3/Submit) id o6ULsNdm008915 for xfs@oss.sgi.com; Fri, 30 Jul 2010 16:54:23 -0500 From: Alex Elder Message-Id: <201007302154.o6ULsNdm008915@stout.americas.sgi.com> Date: Fri, 30 Jul 2010 16:54:23 -0500 To: xfs@oss.sgi.com Subject: [PATCH] xfstests: have getfacl(1) report numeric id's 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 This patch arranges for calls to getfacl(1) to be given the "-n" flag, which requests that user and group id's be listed numerically rather than using names. The affected test output files are also updated to indicate the effect of the change. This eliminates some spurious output differences I was seeing, due to the presence of NIS in my test environment. Signed-off-by: Alex Elder --- 051 | 10 +++++----- 051.out | 20 ++++++++++---------- 067 | 8 ++++---- 067.out | 16 ++++++++-------- 4 files changed, 27 insertions(+), 27 deletions(-) Index: b/051 =================================================================== --- a/051 +++ b/051 @@ -343,23 +343,23 @@ acl5=`_create_n_aces 17` # 1 over A.G. l echo "1 below xfs acl max" chacl $acl1 largeaclfile -getfacl largeaclfile | _filter_aces +getfacl -n largeaclfile | _filter_aces echo "xfs acl max" chacl $acl2 largeaclfile -getfacl largeaclfile | _filter_aces +getfacl -n largeaclfile | _filter_aces echo "1 above xfs acl max" chacl $acl3 largeaclfile -getfacl largeaclfile | _filter_aces +getfacl -n largeaclfile | _filter_aces echo "use 16 aces" chacl $acl4 largeaclfile -getfacl largeaclfile | _filter_aces +getfacl -n largeaclfile | _filter_aces echo "use 17 aces" chacl $acl5 largeaclfile -getfacl largeaclfile | _filter_aces +getfacl -n largeaclfile | _filter_aces #------------------------------------------------------- Index: b/051.out =================================================================== --- a/051.out +++ b/051.out @@ -222,8 +222,8 @@ chacl: a::rwx - Invalid argument === Test out large ACLs === 1 below xfs acl max # file: largeaclfile -# owner: root -# group: root +# owner: 0 +# group: 0 user::rwx user:1:rwx user:2:rwx @@ -251,8 +251,8 @@ other::rwx xfs acl max # file: largeaclfile -# owner: root -# group: root +# owner: 0 +# group: 0 user::rwx user:1:rwx user:2:rwx @@ -282,8 +282,8 @@ other::rwx 1 above xfs acl max chacl: cannot set access acl on "largeaclfile": Invalid argument # file: largeaclfile -# owner: root -# group: root +# owner: 0 +# group: 0 user::rwx user:1:rwx user:2:rwx @@ -312,8 +312,8 @@ other::rwx use 16 aces # file: largeaclfile -# owner: root -# group: root +# owner: 0 +# group: 0 user::rwx user:1:rwx user:2:rwx @@ -333,8 +333,8 @@ other::rwx use 17 aces # file: largeaclfile -# owner: root -# group: root +# owner: 0 +# group: 0 user::rwx user:1:rwx user:2:rwx Index: b/067 =================================================================== --- a/067 +++ b/067 @@ -72,19 +72,19 @@ acl21=`_create_n_aces 21` echo "try 20 aces for access acl" chacl $acl20 largeacldir -getfacl largeacldir | _filter_aces +getfacl -n largeacldir | _filter_aces echo "try 20 aces for default acl" chacl -d $acl20 largeacldir -getfacl largeacldir | _filter_aces +getfacl -n largeacldir | _filter_aces echo "try 21 aces for access acl" chacl $acl21 largeacldir -getfacl largeacldir | _filter_aces +getfacl -n largeacldir | _filter_aces echo "try 21 aces for default acl" chacl -d $acl21 largeacldir -getfacl largeacldir | _filter_aces +getfacl -n largeacldir | _filter_aces # success, all done status=0 Index: b/067.out =================================================================== --- a/067.out +++ b/067.out @@ -3,8 +3,8 @@ QA output created by 067 === Test out large ACLs === try 20 aces for access acl # file: largeacldir -# owner: root -# group: root +# owner: 0 +# group: 0 user::rwx user:1:rwx user:2:rwx @@ -28,8 +28,8 @@ other::rwx try 20 aces for default acl # file: largeacldir -# owner: root -# group: root +# owner: 0 +# group: 0 user::rwx user:1:rwx user:2:rwx @@ -73,8 +73,8 @@ default:other::rwx try 21 aces for access acl # file: largeacldir -# owner: root -# group: root +# owner: 0 +# group: 0 user::rwx user:1:rwx user:2:rwx @@ -119,8 +119,8 @@ default:other::rwx try 21 aces for default acl # file: largeacldir -# owner: root -# group: root +# owner: 0 +# group: 0 user::rwx user:1:rwx user:2:rwx From SRS0+KZOK+60+fromorbit.com=david@internode.on.net Wed Jun 9 10:35:56 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o59FZtFX070931 for ; Wed, 9 Jun 2010 10:35:55 -0500 X-ASG-Debug-ID: 1280531627-5302028a0000-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 7B0171BEE790 for ; Fri, 30 Jul 2010 16:13:48 -0700 (PDT) Received: from mail.internode.on.net (bld-mail17.adl2.internode.on.net [150.101.137.102]) by cuda.sgi.com with ESMTP id 71yduoFRmEwPqVj3 for ; Fri, 30 Jul 2010 16:13:48 -0700 (PDT) Received: from dastard (unverified [121.44.18.238]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 33281553-1927428 for multiple; Sat, 31 Jul 2010 08:43:38 +0930 (CST) Received: from dave by dastard with local (Exim 4.71) (envelope-from ) id 1Oeyll-0002NZ-Cq; Sat, 31 Jul 2010 09:13:37 +1000 Date: Sat, 31 Jul 2010 09:13:37 +1000 From: Dave Chinner To: Badari Pulavarty Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, sandeen@sandeen.net X-ASG-Orig-Subj: Re: [PATCH] dio: track and serialise unaligned direct IO Subject: Re: [PATCH] dio: track and serialise unaligned direct IO Message-ID: <20100730231337.GD2126@dastard> References: <1280443516-14448-1-git-send-email-david@fromorbit.com> <1280511789.16484.18.camel@badari-desktop> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1280511789.16484.18.camel@badari-desktop> 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: 1280531629 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36568 Rule breakdown below pts rule 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, Jul 30, 2010 at 10:43:09AM -0700, Badari Pulavarty wrote: > On Fri, 2010-07-30 at 08:45 +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > If we get two unaligned direct IO's to the same filesystem block > > that is marked as a new allocation (i.e. buffer_new), then both IOs will > > zero the portion of the block they are not writing data to. As a > > result, when the IOs complete there will be a portion of the block > > that contains zeros from the last IO to complete rather than the > > data that should be there. > > > > This is easily manifested by qemu using aio+dio with an unaligned > > guest filesystem - every IO is unaligned and fileystem corruption is > > encountered in the guest filesystem. xfstest 240 (from Eric Sandeen) > > is also a simple reproducer. > > > > To avoid this problem, track unaligned IO that triggers sub-block zeroing and > > check new incoming unaligned IO that require sub-block zeroing against that > > list. If we get an overlap where the start and end of unaligned IOs hit the > > same filesystem block, then we need to block the incoming IOs until the IO that > > is zeroing the block completes. The blocked IO can then continue without > > needing to do any zeroing and hence won't overwrite valid data with zeros. > > > > Signed-off-by: Dave Chinner > > I can confirm that, it fixes corruption of my VM images when using AIO > +DIO. (cache=none,aio=native). I haven't reviewed the patch closely, but > > 1) can we do this only for AIO+DIO combination ? For regular DIO, we > should have all the IOs serialized by i_mutex anyway.. Not for filesystems that do their own locking. In most cases XFS does not take the i_mutiex during DIO writes, and when it does it drops it long before we call into the generic direct IO code that does the sub-block zeroing. So the i_mutex does not guarantee any form of serialisation in direct IO writes at all. > 2) Having a single global list (for all devices) might cause scaling > issues. Unaligned direct IO is undesirable in the first place. While we shouldd behave correctly in this corner case, I0 don't see any need for it to be particularly efficient as the real fix for performance problems with unaligned DIO is to not issue it in the first place. > 3) Are you dropping i_mutex when you are waiting for the zero-out to > finish ? For XFS we're not holding the i_mutex - and we can't take the i_mutex either as that will cause lock inversion issues. We don't know what locks are held, we don't know whether it is safe to drop and take locks, we don't even have the context to operate on filesystem specific locks to avoid ordering problems. If we can't sleep with the locks we already have held at this point, the DIO is already broken for that filesystem. Besides, if the i_mutex is already held for some filesystem when we zero blocks, then we can't very well have concurrent block zeroing in progress, and therefore can't hit this bug, right? Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+7b33aad8d7966417b8fd+2534+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 11 01:37:15 2010 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5B6bC1Z138487 for ; Fri, 11 Jun 2010 01:37:14 -0500 X-ASG-Debug-ID: 1280672107-5a6d003c0000-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 4EE2A48A789; Sun, 1 Aug 2010 07:15:07 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 62awQIuC0Cf7U69k; Sun, 01 Aug 2010 07:15:07 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OfZJj-0004m2-Cj; Sun, 01 Aug 2010 14:15:07 +0000 Date: Sun, 1 Aug 2010 10:15:07 -0400 From: Christoph Hellwig To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfstests: include NIS databases Subject: Re: [PATCH] xfstests: include NIS databases Message-ID: <20100801141507.GA10192@infradead.org> References: <201007302152.o6ULqdcK008761@stout.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201007302152.o6ULqdcK008761@stout.americas.sgi.com> 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: 1280672108 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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, Jul 30, 2010 at 04:52:39PM -0500, Alex Elder wrote: > If NIS is active on a test target system, additional password and > group file information is available via their respective databases > in NIS. Currently, some tests assume that /etc/passwd and /etc/group > are the only places to find this information. > > This patch causes both the local database and the NIS database (if > one is likely to be present) to be consulted for needed information. > > Signed-off-by: Alex Elder Looks good, Reviewed-by: Christoph Hellwig From BATV+7b33aad8d7966417b8fd+2534+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 11 01:37: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 o5B6bsbQ138536 for ; Fri, 11 Jun 2010 01:37:54 -0500 X-ASG-Debug-ID: 1280672149-21fc03690000-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 0DAF548B5B8; Sun, 1 Aug 2010 07:15:49 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id p12YSuQUsvdp0b4D; Sun, 01 Aug 2010 07:15:49 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.72 #1 (Red Hat Linux)) id 1OfZKP-0005fq-MX; Sun, 01 Aug 2010 14:15:49 +0000 Date: Sun, 1 Aug 2010 10:15:49 -0400 From: Christoph Hellwig To: Alex Elder Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfstests: have getfacl(1) report numeric id's Subject: Re: [PATCH] xfstests: have getfacl(1) report numeric id's Message-ID: <20100801141549.GB10192@infradead.org> References: <201007302154.o6ULsNdm008915@stout.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201007302154.o6ULsNdm008915@stout.americas.sgi.com> 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: 1280672150 X-Barracuda-Virus-Scanned: by cuda.sgi.com at 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, Jul 30, 2010 at 04:54:23PM -0500, Alex Elder wrote: > This patch arranges for calls to getfacl(1) to be given the "-n" > flag, which requests that user and group id's be listed numerically > rather than using names. The affected test output files are also > updated to indicate the effect of the change. > > This eliminates some spurious output differences I was seeing, due > to the presence of NIS in my test environment. > > Signed-off-by: Alex Elder Looks good, Reviewed-by: Christoph Hellwig I wonder if this usage should be documented somewhere for future tests. From info@loan.com Fri Jun 11 08:30: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=0.8 required=5.0 tests=BAYES_50 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id o5BDUjHL150687 for ; Fri, 11 Jun 2010 08:30:46 -0500 X-ASG-Debug-ID: 1280696919-472003400000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtp.ehu.es (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2B6C04DC84C for ; Sun, 1 Aug 2010 14:08:40 -0700 (PDT) Received: from smtp.ehu.es (smtp.lg.ehu.es [158.227.0.66]) by cuda.sgi.com with ESMTP id 46SKQ4CsQs4kWGGu for ; Sun, 01 Aug 2010 14:08:40 -0700 (PDT) Received: from lgux65.lgp.ehu.es (localhost.localdomain [127.0.0.1]) by smtp.ehu.es (8.14.4/8.14.4) with ESMTP id o71L58WH025807 for ; Sun, 1 Aug 2010 23:05:22 +0200 Received: from localhost (lgux28.lgp.ehu.es [10.0.100.44]) by lgux65.lgp.ehu.es (8.14.4/8.14.4) with ESMTP id o71L4npM025560; Sun, 1 Aug 2010 23:04:50 +0200 Received: from 41.138.177.203 ([41.138.177.203]) by www.ehu.es (Horde Framework) with HTTP; Sun, 1 Aug 2010 23:08:04 +0200 Message-ID: <20100801230804.19755plz0amjldcs@www.ehu.es> Date: Sun, 1 Aug 2010 23:08:04 +0200 From: DIAMOND FINANCIAL SERVICE Reply-To: diamondloanservicecconcept@gmail.com To: undisclosed-recipients:; X-ASG-Orig-Subj: Ref: DFSL/941OYI/02/SHYN Subject: Ref: DFSL/941OYI/02/SHYN MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; DelSp="Yes"; format="flowed" Content-Disposition: inline Content-Transfer-Encoding: 7bit User-Agent: Internet Messaging Program (IMP) H3 (4.3.7) X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.2.3 (lgux65.lgp.ehu.es [10.0.100.70]); Sun, 01 Aug 2010 23:05:08 +0200 (CEST) X-TM-AS-Product-Ver: IMSS-7.0.0.3116-6.0.0.1038-17544.002 X-TM-AS-Result: Yes-6.605-5.0-31-1 X-imss-scan-details: Yes-6.605-5.0-31-1 X-Barracuda-Connect: smtp.lg.ehu.es[158.227.0.66] X-Barracuda-Start-Time: 1280696921 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2857 1.0000 -0.4101 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.41 X-Barracuda-Spam-Status: No, SCORE=-0.41 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.36752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Ref: DFSL/941OYI/02/SHYN Batch: 12/25/0034 We are Diamond Loan company, legitimate and well registered with registration number(DFSL/941OYI/02/SHYN) We give out Loan from minimum of 500 USD to Maximum of 1,000,000,00USD interested Client should Visit our web sit and click on Apply now in other to fill form or contact us through email, Company details website : www.diamondfinancedept.webs.com email : diamondloanservicecconcept@gmail.com Thanks Joan Sherman(Marketing Dept)