From geert@linux-m68k.org Thu Jan 1 03:50:59 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.1 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n019owGf006663 for ; Thu, 1 Jan 2009 03:50:59 -0600 X-ASG-Debug-ID: 1230803456-664603e00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from winston.telenet-ops.be (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id F2674577A9 for ; Thu, 1 Jan 2009 01:50:56 -0800 (PST) Received: from winston.telenet-ops.be (winston.telenet-ops.be [195.130.137.75]) by cuda.sgi.com with ESMTP id HLOEPBCk5oMGFtQj for ; Thu, 01 Jan 2009 01:50:56 -0800 (PST) Received: from localhost (localhost.localdomain [127.0.0.1]) by winston.telenet-ops.be (Postfix) with SMTP id D3714A0038; Thu, 1 Jan 2009 10:50:55 +0100 (CET) Received: from anakin.of.borg (d54C15368.access.telenet.be [84.193.83.104]) by winston.telenet-ops.be (Postfix) with ESMTP id 890F2A0057; Thu, 1 Jan 2009 10:50:55 +0100 (CET) Received: from anakin.of.borg (localhost [127.0.0.1]) by anakin.of.borg (8.14.3/8.14.3/Debian-5) with ESMTP id n019ot1Y015490 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT); Thu, 1 Jan 2009 10:50:55 +0100 Received: from localhost (geert@localhost) by anakin.of.borg (8.14.3/8.14.3/Submit) with ESMTP id n019oqLs015487; Thu, 1 Jan 2009 10:50:52 +0100 X-Authentication-Warning: anakin.of.borg: geert owned process doing -bs Date: Thu, 1 Jan 2009 10:50:52 +0100 (CET) From: Geert Uytterhoeven Sender: geert@linux-m68k.org To: Lachlan McIlroy , Christoph Hellwig cc: Linus Torvalds , Linux Kernel Development , xfs@oss.sgi.com, Andrew Morton X-ASG-Orig-Subj: Re: [GIT PULL] XFS update for 2.6.29 Subject: Re: [GIT PULL] XFS update for 2.6.29 In-Reply-To: <20081230030845.A4F0558AE206@chook.melbourne.sgi.com> Message-ID: References: <20081230030845.A4F0558AE206@chook.melbourne.sgi.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Barracuda-Connect: winston.telenet-ops.be[195.130.137.75] X-Barracuda-Start-Time: 1230803456 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14141 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, 30 Dec 2008, Lachlan McIlroy wrote: > The following changes since commit 3c92ec8ae91ecf59d88c798301833d7cf83f2179: > Linus Torvalds (1): > Merge branch 'next' of git://git.kernel.org/.../paulus/powerpc > > are available in the git repository at: > > git://oss.sgi.com/oss/git/xfs/xfs.git for-linus > Christoph Hellwig (91): > [XFS] refactor xfs_btree_readahead On m68k, with CONFIG_LBD=n: | fs/xfs/xfs_btree.c: In function 'xfs_btree_readahead_lblock': | fs/xfs/xfs_btree.c:736: warning: comparison is always true due to limited range of data type | fs/xfs/xfs_btree.c:741: warning: comparison is always true due to limited range of data type left/right = xfs_fsblock_t (32 or 64 bit), NULLDFSBNO = xfs_dfsbno_t (64 bit) Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds From SRS0+5d7d118362e34cbfec1b+1957+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 1 11:03:32 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01H3Vbv006469 for ; Thu, 1 Jan 2009 11:03:32 -0600 X-ASG-Debug-ID: 1230829410-1d3d021a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B3CF91BF7DAF; Thu, 1 Jan 2009 09:03:30 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id xMxWMhPS8M21HjC3; Thu, 01 Jan 2009 09:03:30 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LIQxF-0004gN-4B; Thu, 01 Jan 2009 17:03:29 +0000 Date: Thu, 1 Jan 2009 12:03:29 -0500 From: Christoph Hellwig To: Geert Uytterhoeven Cc: Lachlan McIlroy , Christoph Hellwig , Linus Torvalds , Linux Kernel Development , xfs@oss.sgi.com, Andrew Morton X-ASG-Orig-Subj: Re: [GIT PULL] XFS update for 2.6.29 Subject: Re: [GIT PULL] XFS update for 2.6.29 Message-ID: <20090101170329.GA17892@infradead.org> References: <20081230030845.A4F0558AE206@chook.melbourne.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.18 (2008-05-17) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1230829410 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com On Thu, Jan 01, 2009 at 10:50:52AM +0100, Geert Uytterhoeven wrote: > | fs/xfs/xfs_btree.c: In function 'xfs_btree_readahead_lblock': > | fs/xfs/xfs_btree.c:736: warning: comparison is always true due to limited range of data type > | fs/xfs/xfs_btree.c:741: warning: comparison is always true due to limited range of data type > > left/right = xfs_fsblock_t (32 or 64 bit), NULLDFSBNO = xfs_dfsbno_t (64 bit) Hmm, can't reproduce it here with CONFIG_LBD=n on x86, but the following patch should fix it: Index: linux-2.6/fs/xfs/xfs_btree.c =================================================================== --- linux-2.6.orig/fs/xfs/xfs_btree.c 2009-01-01 15:57:04.606547140 +0100 +++ linux-2.6/fs/xfs/xfs_btree.c 2009-01-01 15:57:24.780673454 +0100 @@ -730,8 +730,8 @@ xfs_btree_readahead_lblock( struct xfs_btree_block *block) { int rval = 0; - xfs_fsblock_t left = be64_to_cpu(block->bb_u.l.bb_leftsib); - xfs_fsblock_t right = be64_to_cpu(block->bb_u.l.bb_rightsib); + xfs_dfsbno_t left = be64_to_cpu(block->bb_u.l.bb_leftsib); + xfs_dfsbno_t right = be64_to_cpu(block->bb_u.l.bb_rightsib); if ((lr & XFS_BTCUR_LEFTRA) && left != NULLDFSBNO) { xfs_btree_reada_bufl(cur->bc_mp, left, 1); From SRS0+5d7d118362e34cbfec1b+1957+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 1 11:14:45 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01HEjH5007288 for ; Thu, 1 Jan 2009 11:14:45 -0600 X-ASG-Debug-ID: 1230830081-4213023f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2AC8657F1F for ; Thu, 1 Jan 2009 09:14:41 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 1UU7Ygkn4Tp57q5i for ; Thu, 01 Jan 2009 09:14:41 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LIR7Z-0005nh-Nf; Thu, 01 Jan 2009 17:14:09 +0000 Date: Thu, 1 Jan 2009 12:14:09 -0500 From: Christoph Hellwig To: Mario Becroft Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS internal error when NFS client accesses nonexistent inode Subject: Re: XFS internal error when NFS client accesses nonexistent inode Message-ID: <20090101171409.GA18020@infradead.org> References: <87zlicfncr.fsf@server.ak.quickcircuit.co.nz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <87zlicfncr.fsf@server.ak.quickcircuit.co.nz> User-Agent: Mutt/1.5.18 (2008-05-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: 1230830084 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com On Thu, Jan 01, 2009 at 03:09:08AM +1300, Mario Becroft wrote: > I hit a seemingly strange problem today when I xfsdump/restored some > filesystems from one volume onto another. When I exported the new > volumes, errors like the following started to occur: > > Dec 31 09:12:46 nfs1 kernel: nfsd: non-standard errno: -117 > > Bumping up the XFS debug level revealed the following (full details at > the end): > > Dec 31 09:12:46 nfs1 kernel: Filesystem "dm-17": XFS internal error xfs_imap_to_bp at line 186 of file fs/xfs/xfs_inode.c. Caller 0xffffffff80374c48 This is: di_ok = be16_to_cpu(dip->di_core.di_magic) == XFS_DINODE_GOOD_VERSION(dip->di_core.di_version); if (unlikely(XFS_TEST_ERROR(!di_ok, mp, XFS_ERRTAG_ITOBP_INOTOBP, XFS_RANDOM_ITOBP_INOTOBP))) { if (imap_flags & XFS_IMAP_BULKSTAT) { xfs_trans_brelse(tp, bp); return XFS_ERROR(EINVAL); } here --> XFS_CORRUPTION_ERROR("xfs_imap_to_bp", XFS_ERRLEVEL_HIGH, mp, dip); > After wasting quite a lot of time, I finally realised that this was > probably caused by NFS clients accessing nonexistent file handles that > they had open from when the filesystem was previously exported, prior to > the dump/restore. > > Is my analysis correct? Is an internal error the expected behaviour in > this case? And can this cause any harm? That explanation makes a lot of sense. As seen in the snipplet above we actually have checks for bulkstat which might hand in invalid inode numbers, and I think we need to extent this check to nfs export and the handle ioctls, too as we can get arbitrary inode numbers passed from a client / user space. In addition we should probably translate the error number into something more useful. I will create a testcase using the handle ioctls for this and provide a fix to handle this issue more gracefully. Except for shutting down a perfectly fine filesystem this should not cause additional damage. From SRS0+5d7d118362e34cbfec1b+1957+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 1 11:17:15 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01HHEWX007587 for ; Thu, 1 Jan 2009 11:17:15 -0600 X-ASG-Debug-ID: 1230830233-416d008a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E765E1BF7E05; Thu, 1 Jan 2009 09:17:13 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Z9elgotfTrEHgb3B; Thu, 01 Jan 2009 09:17:13 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LIRAX-0006HL-Lv; Thu, 01 Jan 2009 17:17:13 +0000 Date: Thu, 1 Jan 2009 12:17:13 -0500 From: Christoph Hellwig To: Mario Becroft Cc: xfs@oss.sgi.com, wkendall@sgi.com X-ASG-Orig-Subj: Feature requests, was Re: XFS internal error when NFS client accesses nonexistent inode Subject: Feature requests, was Re: XFS internal error when NFS client accesses nonexistent inode Message-ID: <20090101171713.GB18020@infradead.org> References: <87zlicfncr.fsf@server.ak.quickcircuit.co.nz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <87zlicfncr.fsf@server.ak.quickcircuit.co.nz> User-Agent: Mutt/1.5.18 (2008-05-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: 1230830233 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com On Thu, Jan 01, 2009 at 03:09:08AM +1300, Mario Becroft wrote: > While I am writing, two things I wish XFS could do, and two more that > would be jolly nice to have: > > 1. shrink filesystems http://xfs.org/index.php/Shrinking_Support > 2. dump/restore preserving inode numbers That's very hard to do, given that inode numbers encode the location on disk. To support your NFS exporting scenario you would also have to preserve the generation number, which also forms part of the nfs file handle. > 3. high-performance dump with multi-threaded reading to fully utilise > disk throughput Didn't xfsdump in IRIX have some sort of multi-stream support. Bill, do you remember anything like that? > 4. on-line xfs_check/repair Well, you can check online, it's just not going to give good results. Using snaphots you can easily check online, and with a little hack even repair, but you'd still have to reboot to then use the repaired filesystem. From SRS0+5d7d118362e34cbfec1b+1957+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 1 11:37:57 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01HbvxJ009025 for ; Thu, 1 Jan 2009 11:37:57 -0600 X-ASG-Debug-ID: 1230831476-08b503af0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B47201BF7CEC for ; Thu, 1 Jan 2009 09:37:56 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id vwkoX3dO19H3RclK for ; Thu, 01 Jan 2009 09:37:56 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LIRUa-00086T-FS; Thu, 01 Jan 2009 17:37:56 +0000 Date: Thu, 1 Jan 2009 12:37:56 -0500 From: Christoph Hellwig To: Mario Becroft Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS internal error when NFS client accesses nonexistent inode Subject: Re: XFS internal error when NFS client accesses nonexistent inode Message-ID: <20090101173756.GA31126@infradead.org> References: <87zlicfncr.fsf@server.ak.quickcircuit.co.nz> <20090101171409.GA18020@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090101171409.GA18020@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-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: 1230831476 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com This should cure your shutdowns on a 2.6.27-ish codebase: Index: btrfs-unstable/fs/xfs/linux-2.6/xfs_export.c =================================================================== --- btrfs-unstable.orig/fs/xfs/linux-2.6/xfs_export.c 2009-01-01 18:34:39.868671500 +0100 +++ btrfs-unstable/fs/xfs/linux-2.6/xfs_export.c 2009-01-01 18:35:37.224782654 +0100 @@ -127,8 +127,8 @@ xfs_nfs_get_inode( if (ino == 0) return ERR_PTR(-ESTALE); - error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_SHARED, &ip, 0); + error = xfs_iget(mp, NULL, ino, XFS_IGET_BULKSTAT, XFS_ILOCK_SHARED, &ip, 0); return ERR_PTR(-error); if (!ip) return ERR_PTR(-EIO); From SRS0+5d7d118362e34cbfec1b+1957+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 1 11:45:56 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_14, J_CHICKENPOX_31,J_CHICKENPOX_41,J_CHICKENPOX_53 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01HjuYN009427 for ; Thu, 1 Jan 2009 11:45:56 -0600 X-ASG-Debug-ID: 1230831955-416f010a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 527A71BF8141 for ; Thu, 1 Jan 2009 09:45:55 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id aut5NbdYra4ODB4o for ; Thu, 01 Jan 2009 09:45:55 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LIRbn-0000Zx-UM; Thu, 01 Jan 2009 17:45:23 +0000 Date: Thu, 1 Jan 2009 12:45:23 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: J?rgen Tegn?r X-ASG-Orig-Subj: fix fsrlast location in --help output Subject: fix fsrlast location in --help output Message-ID: <20090101174523.GA515@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-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: 1230831955 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com Make sure xfs_fsr --help outputs the correct location for the fsrlast file. Also add a _PATH_FSRLAST define to not have to keep this multiple times in the source code, and remove a comment in xfs_fsr.c duplicating the help text and manpage. This fixes Debian bug #491525. Reported-by: J?rgen Tegn?r Signed-off-by: Christoph Hellwig Index: xfsdump/fsr/xfs_fsr.c =================================================================== --- xfsdump.orig/fsr/xfs_fsr.c 2009-01-01 11:00:32.298701760 +0100 +++ xfsdump/fsr/xfs_fsr.c 2009-01-01 11:03:47.782548742 +0100 @@ -16,31 +16,6 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -/* - * fsr - file system reorganizer - * - * fsr [-d] [-v] [-n] [-s] [-g] [-t secs] [-f leftf] [-m mtab] - * fsr [-d] [-v] [-n] [-s] [-g] xfsdev | dir | file ... - * - * If invoked in the first form fsr does the following: starting with the - * dev/inum specified in /etc/fsrlast this reorgs each reg file in each file - * system found in /etc/mtab. After 2 hours of this we record the current - * dev/inum in /etc/fsrlast. If there is no /etc/fsrlast fsr starts at the - * top of /etc/mtab. - * - * -g print to syslog (default if stdout not a tty) - * -m mtab use something other than /etc/mtab - * -t time how long to run - * -f leftoff use this instead of /etc/fsrlast - * - * -v verbose. more -v's more verbose - * -d debug. print even more - * -n do nothing. only interesting with -v. Not - * effective with in mtab mode. - * -s print statistics only. - * -p passes Number of passes before terminating global re-org. - */ - #include #include #include "config.h" @@ -63,6 +38,7 @@ #define XFS_XFLAG_NODEFRAG 0x00002000 /* src dependancy, remove later */ #endif +#define _PATH_FSRLAST "/var/tmp/.fsrlast_xfs" char *progname; @@ -98,7 +74,7 @@ static __int64_t minimumfree = 2048; #define min(x, y) ((x) < (y) ? (x) : (y)) static time_t howlong = 7200; /* default seconds of reorganizing */ -static char *leftofffile = "/var/tmp/.fsrlast_xfs";/* where we left off last */ +static char *leftofffile = _PATH_FSRLAST; /* where we left off last */ static char *mtab = MOUNTED; static time_t endtime; static time_t starttime; @@ -368,11 +344,11 @@ usage(int ret) " -g Print to syslog (default if stdout not a tty).\n" " -t time How long to run in seconds.\n" " -p passes Number of passes before terminating global re-org.\n" -" -f leftoff Use this instead of /etc/fsrlast.\n" +" -f leftoff Use this instead of %s.\n" " -m mtab Use something other than /etc/mtab.\n" " -d Debug, print even more.\n" " -v Verbose, more -v's more verbose.\n" - ), progname, progname); + ), progname, progname, _PATH_FSRLAST); exit(ret); } From sandeen@sandeen.net Thu Jan 1 11:55:56 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.2 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01Htn6e010256 for ; Thu, 1 Jan 2009 11:55:56 -0600 X-ASG-Debug-ID: 1230832547-2a6e025f0000-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 6C20D1BF805E for ; Thu, 1 Jan 2009 09:55:47 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id aOKqcQfXEaFpd1kK for ; Thu, 01 Jan 2009 09:55:47 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id DEE6FAABFCB; Thu, 1 Jan 2009 11:55:46 -0600 (CST) Message-ID: <495D03A1.6090307@sandeen.net> Date: Thu, 01 Jan 2009 11:55:45 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.19 (Macintosh/20081209) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: make install-qa should only install additional headers Subject: Re: [PATCH] xfsprogs: make install-qa should only install additional headers References: <20081230174152.GA18469@infradead.org> In-Reply-To: <20081230174152.GA18469@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1230832548 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14168 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Christoph Hellwig wrote: > make install-qa should only install the headers a normal install-dev > doesn't install instead of repeating the whole game. > > That way the additional headers for xfsqa can be installed manually > while using dpkg / rpm for the normal package. This seems mostly ok, but "install-qa" sort of sounds like it should install the headers you need for qa and it doesn't, it only (now) installs the extras right...? By itself it's kind of a useless target without also running install-dev isn't it? To be correct, I think install-qa should have install-dev as a prereq. Maybe do that, and add a new install-qa-only target? :) > > Signed-off-by: Christoph Hellwig > > Index: xfsprogs/Makefile > =================================================================== > --- xfsprogs/Makefile 2008-12-30 13:03:06.000000000 +0000 > +++ xfsprogs/Makefile 2008-12-30 13:03:15.000000000 +0000 > @@ -76,7 +76,7 @@ > > install-dev: default $(addsuffix -install-dev,$(SUBDIRS)) > > -install-qa: install $(addsuffix -install-qa,$(SUBDIRS)) > +install-qa: default $(addsuffix -install-qa,$(SUBDIRS)) > > %-install: > $(MAKE) -C $* install > Index: xfsprogs/include/Makefile > =================================================================== > --- xfsprogs/include/Makefile 2008-12-30 13:02:05.000000000 +0000 > +++ xfsprogs/include/Makefile 2008-12-30 13:02:31.000000000 +0000 > @@ -54,5 +54,5 @@ > $(INSTALL) -m 755 -d $(DK_INC_DIR) > $(INSTALL) -m 644 $(DKHFILES) $(DK_INC_DIR) > > -install-qa: install-dev > +install-qa: default > $(INSTALL) -m 644 $(QAHFILES) $(PKG_INC_DIR) > Index: xfsprogs/libdisk/Makefile > =================================================================== > --- xfsprogs/libdisk/Makefile 2008-12-30 13:00:53.000000000 +0000 > +++ xfsprogs/libdisk/Makefile 2008-12-30 13:01:39.000000000 +0000 > @@ -29,4 +29,4 @@ > install-dev: default > $(INSTALL_LTLIB_STATIC) > > -install-qa: install-dev > +install-qa: default > Index: xfsprogs/libhandle/Makefile > =================================================================== > --- xfsprogs/libhandle/Makefile 2008-12-30 13:01:09.000000000 +0000 > +++ xfsprogs/libhandle/Makefile 2008-12-30 13:01:34.000000000 +0000 > @@ -22,4 +22,4 @@ > install-dev: default > $(INSTALL_LTLIB_DEV) > > -install-qa: install-dev > +install-qa: default > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Thu Jan 1 12:04:41 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_14, J_CHICKENPOX_31,J_CHICKENPOX_41,J_CHICKENPOX_53 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01I4fhv010728 for ; Thu, 1 Jan 2009 12:04:41 -0600 X-ASG-Debug-ID: 1230833079-417001870000-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 448061BF7F72 for ; Thu, 1 Jan 2009 10:04:39 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id kyU2CTrVOJIekqnu for ; Thu, 01 Jan 2009 10:04:39 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 5B2E2A9FEA0; Thu, 1 Jan 2009 12:04:40 -0600 (CST) Message-ID: <495D05B7.8020600@sandeen.net> Date: Thu, 01 Jan 2009 12:04:39 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.19 (Macintosh/20081209) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs@oss.sgi.com, J?rgen Tegn?r X-ASG-Orig-Subj: Re: fix fsrlast location in --help output Subject: Re: fix fsrlast location in --help output References: <20090101174523.GA515@infradead.org> In-Reply-To: <20090101174523.GA515@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1230833080 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14168 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Christoph Hellwig wrote: > Make sure xfs_fsr --help outputs the correct location for the fsrlast > file. Also add a _PATH_FSRLAST define to not have to keep this multiple > times in the source code, and remove a comment in xfs_fsr.c duplicating > the help text and manpage. > > This fixes Debian bug #491525. > > > Reported-by: J?rgen Tegn?r > Signed-off-by: Christoph Hellwig Reviewed-by: Eric Sandeen > Index: xfsdump/fsr/xfs_fsr.c > =================================================================== > --- xfsdump.orig/fsr/xfs_fsr.c 2009-01-01 11:00:32.298701760 +0100 > +++ xfsdump/fsr/xfs_fsr.c 2009-01-01 11:03:47.782548742 +0100 > @@ -16,31 +16,6 @@ > * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > */ > > -/* > - * fsr - file system reorganizer > - * > - * fsr [-d] [-v] [-n] [-s] [-g] [-t secs] [-f leftf] [-m mtab] > - * fsr [-d] [-v] [-n] [-s] [-g] xfsdev | dir | file ... > - * > - * If invoked in the first form fsr does the following: starting with the > - * dev/inum specified in /etc/fsrlast this reorgs each reg file in each file > - * system found in /etc/mtab. After 2 hours of this we record the current > - * dev/inum in /etc/fsrlast. If there is no /etc/fsrlast fsr starts at the > - * top of /etc/mtab. > - * > - * -g print to syslog (default if stdout not a tty) > - * -m mtab use something other than /etc/mtab > - * -t time how long to run > - * -f leftoff use this instead of /etc/fsrlast > - * > - * -v verbose. more -v's more verbose > - * -d debug. print even more > - * -n do nothing. only interesting with -v. Not > - * effective with in mtab mode. > - * -s print statistics only. > - * -p passes Number of passes before terminating global re-org. > - */ > - > #include > #include > #include "config.h" > @@ -63,6 +38,7 @@ > #define XFS_XFLAG_NODEFRAG 0x00002000 /* src dependancy, remove later */ > #endif > > +#define _PATH_FSRLAST "/var/tmp/.fsrlast_xfs" > > char *progname; > > @@ -98,7 +74,7 @@ static __int64_t minimumfree = 2048; > #define min(x, y) ((x) < (y) ? (x) : (y)) > > static time_t howlong = 7200; /* default seconds of reorganizing */ > -static char *leftofffile = "/var/tmp/.fsrlast_xfs";/* where we left off last */ > +static char *leftofffile = _PATH_FSRLAST; /* where we left off last */ > static char *mtab = MOUNTED; > static time_t endtime; > static time_t starttime; > @@ -368,11 +344,11 @@ usage(int ret) > " -g Print to syslog (default if stdout not a tty).\n" > " -t time How long to run in seconds.\n" > " -p passes Number of passes before terminating global re-org.\n" > -" -f leftoff Use this instead of /etc/fsrlast.\n" > +" -f leftoff Use this instead of %s.\n" > " -m mtab Use something other than /etc/mtab.\n" > " -d Debug, print even more.\n" > " -v Verbose, more -v's more verbose.\n" > - ), progname, progname); > + ), progname, progname, _PATH_FSRLAST); > exit(ret); > } > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From SRS0+5d7d118362e34cbfec1b+1957+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 1 13:00:41 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01J0ecQ014186 for ; Thu, 1 Jan 2009 13:00:41 -0600 X-ASG-Debug-ID: 1230836439-416e02990000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0FF171BF81F4 for ; Thu, 1 Jan 2009 11:00:39 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 3dDGwCEoFJ0en9mT for ; Thu, 01 Jan 2009 11:00:39 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LISmd-0008Cw-NI; Thu, 01 Jan 2009 19:00:39 +0000 Date: Thu, 1 Jan 2009 14:00:39 -0500 From: Christoph Hellwig To: Mario Becroft Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS internal error when NFS client accesses nonexistent inode Subject: Re: XFS internal error when NFS client accesses nonexistent inode Message-ID: <20090101190039.GA29959@infradead.org> References: <87zlicfncr.fsf@server.ak.quickcircuit.co.nz> <20090101171409.GA18020@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090101171409.GA18020@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-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: 1230836440 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com Btw, you update /proc/sys/fs/xfs/error_level manually? The corruption test only triggers from a avalue of 5, but 3 is the default. From SRS0+5d7d118362e34cbfec1b+1957+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 1 13:21:19 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01JLI8J015967 for ; Thu, 1 Jan 2009 13:21:19 -0600 X-ASG-Debug-ID: 1230837676-4c6500310000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0B3E358275 for ; Thu, 1 Jan 2009 11:21:16 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id hSFeFEWLB3vQ8hzj for ; Thu, 01 Jan 2009 11:21:16 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LIT6a-0001p0-Cg; Thu, 01 Jan 2009 19:21:16 +0000 Date: Thu, 1 Jan 2009 14:21:16 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: Mario Becroft X-ASG-Orig-Subj: [PATCH] pass XFS_IGET_BULKSTAT to xfs_iget for handle operations Subject: [PATCH] pass XFS_IGET_BULKSTAT to xfs_iget for handle operations Message-ID: <20090101192116.GA6986@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-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: 1230837678 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com NFS clients or users of the handle ioctls can pass us arbitrary inode numbers through the exportfs interface. Make sure we use the XFS_IGET_BULKSTAT so that these don't cause shutdowns due to the corruption checks. Also translate the EINVAL we get back for invalid inode clusters into an ESTALE which is more appropinquate, and remove the useless check for a NULL inode on a successfull xfs_iget return. I have a testcase to reproduce this using the handle interface which I will submit to xfsqa. Reported-by: Mario Becroft 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 2009-01-01 20:06:06.145674550 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_export.c 2009-01-01 20:14:59.673658382 +0100 @@ -126,11 +126,26 @@ xfs_nfs_get_inode( if (ino == 0) return ERR_PTR(-ESTALE); - error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_SHARED, &ip, 0); - if (error) + /* + * 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. + */ + error = xfs_iget(mp, NULL, ino, XFS_IGET_BULKSTAT, + XFS_ILOCK_SHARED, &ip, 0); + if (error) { + /* + * EINVAL means the inode cluster doesn't exist anymore. + * This implies the filehandle is stale, so we should + * translate it here. + * We don't use ESTALE directly down the chain to not + * confuse applications using bulkstat that expect EINVAL. + */ + if (error == EINVAL) + error = ESTALE; return ERR_PTR(-error); - if (!ip) - return ERR_PTR(-EIO); + } if (ip->i_d.di_gen != generation) { xfs_iput_new(ip, XFS_ILOCK_SHARED); From sandeen@sandeen.net Thu Jan 1 16:25:56 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.2 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_93 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01MPuhm030698 for ; Thu, 1 Jan 2009 16:25:56 -0600 X-ASG-Debug-ID: 1230848751-4257006a0000-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 C7F6258593 for ; Thu, 1 Jan 2009 14:25:52 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id QE5AUzN63D9LJnXi for ; Thu, 01 Jan 2009 14:25:52 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 9A64DAC6273 for ; Thu, 1 Jan 2009 16:25:19 -0600 (CST) Message-ID: <495D42CE.6060806@sandeen.net> Date: Thu, 01 Jan 2009 16:25:18 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.19 (Macintosh/20081209) MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: [PATCH] create xfstests install target Subject: [PATCH] create xfstests install target Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1230848754 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14183 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Not sure what the best location for this is in the end, but that's just a one-line change in builddefs.in if it should move. Currently it goes to whatever configure thinks "libexecdir" is. Once we have an install target we can probably hook this up to makepkgs etc, too, and even publish tarballs & packages. :) Signed-off-by: Eric Sandeen --- Index: xfstests-dev.work/Makefile =================================================================== --- xfstests-dev.work.orig/Makefile +++ xfstests-dev.work/Makefile @@ -62,7 +62,21 @@ $(DMAPI_MAKEFILE): aclocal.m4:: aclocal --acdir=`pwd`/m4 --output=$@ -install install-dev install-lib: +install: default $(addsuffix -install,$(SUBDIRS)) + $(INSTALL) -m 755 -d $(PKG_LIB_DIR) + $(INSTALL) -m 755 check $(PKG_LIB_DIR) + $(INSTALL) -m 755 [0-9]?? $(PKG_LIB_DIR) + $(INSTALL) -m 755 run.* $(PKG_LIB_DIR) + $(INSTALL) -m 644 group $(PKG_LIB_DIR) + $(INSTALL) -m 644 randomize.awk $(PKG_LIB_DIR) + $(INSTALL) -m 644 [0-9]??.* $(PKG_LIB_DIR) + $(INSTALL) -m 644 common* $(PKG_LIB_DIR) + +# Nothing. +install-dev install-lib: + +%-install: + $(MAKE) -C $* install realclean distclean: clean rm -f $(LDIRT) $(CONFIGURE) Index: xfstests-dev.work/include/builddefs.in =================================================================== --- xfstests-dev.work.orig/include/builddefs.in +++ xfstests-dev.work/include/builddefs.in @@ -27,6 +27,8 @@ PKG_RELEASE = @pkg_release@ PKG_VERSION = @pkg_version@ PKG_PLATFORM = @pkg_platform@ PKG_DISTRIBUTION= @pkg_distribution@ +PKG_SBIN_DIR = @sbindir@ +PKG_LIB_DIR = @libexecdir@@libdirsuffix@/@pkg_name@ CC = @cc@ AWK = @awk@ Index: xfstests-dev.work/ltp/Makefile =================================================================== --- xfstests-dev.work.orig/ltp/Makefile +++ xfstests-dev.work/ltp/Makefile @@ -49,3 +49,8 @@ ifeq ($(HAVE_AIO), true) aio-stress: aio-stress.c $(LINKTEST) $(LIBAIO) $(LDLIBS) endif + +install: + $(INSTALL) -m 755 -d $(PKG_LIB_DIR)/ltp + $(INSTALL) -m 755 $(TARGETS) $(PKG_LIB_DIR)/ltp + Index: xfstests-dev.work/src/Makefile =================================================================== --- xfstests-dev.work.orig/src/Makefile +++ xfstests-dev.work/src/Makefile @@ -126,3 +126,10 @@ open_unlink: open_unlink.o $(LIBHANDLE) $(LINKTEST) $(LIBHANDLE) $(LDLIBS) endif + +install: + $(INSTALL) -m 755 -d $(PKG_LIB_DIR)/src + $(INSTALL) -m 755 $(TARGETS) $(PKG_LIB_DIR)/src + $(INSTALL) -m 755 fill2attr fill2fs $(PKG_LIB_DIR)/src + $(INSTALL) -m 755 fill2fs_check scaleread.sh $(PKG_LIB_DIR)/src + $(INSTALL) -m 644 dumpfile $(PKG_LIB_DIR)/src From sandeen@sandeen.net Thu Jan 1 16:32:05 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.2 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01MW5gA031208 for ; Thu, 1 Jan 2009 16:32:05 -0600 X-ASG-Debug-ID: 1230849122-42ae013d0000-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 6C0CD1BF860C for ; Thu, 1 Jan 2009 14:32:02 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id xOWRVN92FT9aEZB1 for ; Thu, 01 Jan 2009 14:32:02 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 64A14AC6273; Thu, 1 Jan 2009 16:31:32 -0600 (CST) Message-ID: <495D4443.6010104@sandeen.net> Date: Thu, 01 Jan 2009 16:31:31 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.19 (Macintosh/20081209) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs@oss.sgi.com, Mario Becroft X-ASG-Orig-Subj: Re: [PATCH] pass XFS_IGET_BULKSTAT to xfs_iget for handle operations Subject: Re: [PATCH] pass XFS_IGET_BULKSTAT to xfs_iget for handle operations References: <20090101192116.GA6986@infradead.org> In-Reply-To: <20090101192116.GA6986@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1230849124 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14183 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Christoph Hellwig wrote: > NFS clients or users of the handle ioctls can pass us arbitrary inode > numbers through the exportfs interface. Make sure we use the > XFS_IGET_BULKSTAT so that these don't cause shutdowns due to the corruption > checks. Also translate the EINVAL we get back for invalid inode clusters > into an ESTALE which is more appropinquate, and remove the useless check > for a NULL inode on a successfull xfs_iget return. > > I have a testcase to reproduce this using the handle interface which > I will submit to xfsqa. > > > Reported-by: Mario Becroft > Signed-off-by: Christoph Hellwig Reviewed-by: Eric Sandeen > Index: xfs/fs/xfs/linux-2.6/xfs_export.c > =================================================================== > --- xfs.orig/fs/xfs/linux-2.6/xfs_export.c 2009-01-01 20:06:06.145674550 +0100 > +++ xfs/fs/xfs/linux-2.6/xfs_export.c 2009-01-01 20:14:59.673658382 +0100 > @@ -126,11 +126,26 @@ xfs_nfs_get_inode( > if (ino == 0) > return ERR_PTR(-ESTALE); > > - error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_SHARED, &ip, 0); > - if (error) > + /* > + * 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. > + */ > + error = xfs_iget(mp, NULL, ino, XFS_IGET_BULKSTAT, > + XFS_ILOCK_SHARED, &ip, 0); > + if (error) { > + /* > + * EINVAL means the inode cluster doesn't exist anymore. > + * This implies the filehandle is stale, so we should > + * translate it here. > + * We don't use ESTALE directly down the chain to not > + * confuse applications using bulkstat that expect EINVAL. > + */ > + if (error == EINVAL) > + error = ESTALE; > return ERR_PTR(-error); > - if (!ip) > - return ERR_PTR(-EIO); > + } > > if (ip->i_d.di_gen != generation) { > xfs_iput_new(ip, XFS_ILOCK_SHARED); > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Thu Jan 1 16:40:58 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.2 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01Mewdh031892 for ; Thu, 1 Jan 2009 16:40:58 -0600 X-ASG-Debug-ID: 1230849656-135902070000-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 E1BFB58670 for ; Thu, 1 Jan 2009 14:40:56 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id 0cvBYdAFE0zBvxin for ; Thu, 01 Jan 2009 14:40:56 -0800 (PST) Received: by mail.sandeen.net (Postfix, from userid 500) id 1FCBDA84090; Thu, 1 Jan 2009 16:40:57 -0600 (CST) Message-Id: <20090101224056.845580476@sandeen.net> References: <20090101224009.616367334@sandeen.net> User-Agent: quilt/0.46-1 Date: Thu, 01 Jan 2009 16:40:10 -0600 From: Eric Sandeen To: xfs@oss.sgi.com X-ASG-Orig-Subj: [patch 1/4] Remove several unused typedefs. Subject: [patch 1/4] Remove several unused typedefs. Content-Disposition: inline; filename=unused_typedefs X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1230849656 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14183 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Eric Sandeen --- Index: xfs/fs/xfs/linux-2.6/xfs_aops.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_aops.h +++ xfs/fs/xfs/linux-2.6/xfs_aops.h @@ -21,8 +21,6 @@ extern struct workqueue_struct *xfsdatad_workqueue; extern mempool_t *xfs_ioend_pool; -typedef void (*xfs_ioend_func_t)(void *); - /* * xfs_ioend struct manages large extent writes for XFS. * It can manage several multi-page bio's at once. Index: xfs/fs/xfs/xfs_acl.h =================================================================== --- xfs.orig/fs/xfs/xfs_acl.h +++ xfs/fs/xfs/xfs_acl.h @@ -22,7 +22,6 @@ * Access Control Lists */ typedef __uint16_t xfs_acl_perm_t; -typedef __int32_t xfs_acl_type_t; typedef __int32_t xfs_acl_tag_t; typedef __int32_t xfs_acl_id_t; Index: xfs/fs/xfs/xfs_types.h =================================================================== --- xfs.orig/fs/xfs/xfs_types.h +++ xfs/fs/xfs/xfs_types.h @@ -111,8 +111,6 @@ typedef __uint64_t xfs_fileoff_t; /* blo typedef __int64_t xfs_sfiloff_t; /* signed block number in a file */ typedef __uint64_t xfs_filblks_t; /* number of blocks in a file */ -typedef __uint8_t xfs_arch_t; /* architecture of an xfs fs */ - /* * Null values for the types. */ -- From sandeen@sandeen.net Thu Jan 1 16:40:59 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_55, J_CHICKENPOX_57 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01Mex7o031902 for ; Thu, 1 Jan 2009 16:40:59 -0600 X-ASG-Debug-ID: 1230849656-3ef1020e0000-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 A141B1BF865F for ; Thu, 1 Jan 2009 14:40:56 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id UBcJiTI2IK8pWVwB for ; Thu, 01 Jan 2009 14:40:56 -0800 (PST) Received: by mail.sandeen.net (Postfix, from userid 500) id 6C4F8A81D59; Thu, 1 Jan 2009 16:40:57 -0600 (CST) Message-Id: <20090101224057.147361063@sandeen.net> References: <20090101224009.616367334@sandeen.net> User-Agent: quilt/0.46-1 Date: Thu, 01 Jan 2009 16:40:11 -0600 From: Eric Sandeen To: xfs@oss.sgi.com X-ASG-Orig-Subj: [patch 2/4] Remove macro-to-function indirections in attr code Subject: [patch 2/4] Remove macro-to-function indirections in attr code Content-Disposition: inline; filename=ATTR_SHOUTING X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1230849657 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14183 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Eric Sandeen --- Index: xfs/fs/xfs/xfs_attr_leaf.c =================================================================== --- xfs.orig/fs/xfs/xfs_attr_leaf.c +++ xfs/fs/xfs/xfs_attr_leaf.c @@ -736,7 +736,7 @@ xfs_attr_shortform_allfit(xfs_dabuf_t *b continue; /* don't copy partial entries */ if (!(entry->flags & XFS_ATTR_LOCAL)) return(0); - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf, i); + name_loc = xfs_attr_leaf_name_local(leaf, i); if (name_loc->namelen >= XFS_ATTR_SF_ENTSIZE_MAX) return(0); if (be16_to_cpu(name_loc->valuelen) >= XFS_ATTR_SF_ENTSIZE_MAX) @@ -823,7 +823,7 @@ xfs_attr_leaf_to_shortform(xfs_dabuf_t * if (!entry->nameidx) continue; ASSERT(entry->flags & XFS_ATTR_LOCAL); - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf, i); + name_loc = xfs_attr_leaf_name_local(leaf, i); nargs.name = (char *)name_loc->nameval; nargs.namelen = name_loc->namelen; nargs.value = (char *)&name_loc->nameval[nargs.namelen]; @@ -1141,14 +1141,14 @@ xfs_attr_leaf_add_work(xfs_dabuf_t *bp, * as part of this transaction (a split operation for example). */ if (entry->flags & XFS_ATTR_LOCAL) { - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf, args->index); + name_loc = xfs_attr_leaf_name_local(leaf, args->index); name_loc->namelen = args->namelen; name_loc->valuelen = cpu_to_be16(args->valuelen); memcpy((char *)name_loc->nameval, args->name, args->namelen); memcpy((char *)&name_loc->nameval[args->namelen], args->value, be16_to_cpu(name_loc->valuelen)); } else { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, args->index); + name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); name_rmt->namelen = args->namelen; memcpy((char *)name_rmt->name, args->name, args->namelen); entry->flags |= XFS_ATTR_INCOMPLETE; @@ -1159,7 +1159,7 @@ xfs_attr_leaf_add_work(xfs_dabuf_t *bp, args->rmtblkcnt = XFS_B_TO_FSB(mp, args->valuelen); } xfs_da_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, XFS_ATTR_LEAF_NAME(leaf, args->index), + XFS_DA_LOGRANGE(leaf, xfs_attr_leaf_name(leaf, args->index), xfs_attr_leaf_entsize(leaf, args->index))); /* @@ -1749,10 +1749,10 @@ xfs_attr_leaf_remove(xfs_dabuf_t *bp, xf /* * Compress the remaining entries and zero out the removed stuff. */ - memset(XFS_ATTR_LEAF_NAME(leaf, args->index), 0, entsize); + memset(xfs_attr_leaf_name(leaf, args->index), 0, entsize); be16_add_cpu(&hdr->usedbytes, -entsize); xfs_da_log_buf(args->trans, bp, - XFS_DA_LOGRANGE(leaf, XFS_ATTR_LEAF_NAME(leaf, args->index), + XFS_DA_LOGRANGE(leaf, xfs_attr_leaf_name(leaf, args->index), entsize)); tmp = (be16_to_cpu(hdr->count) - args->index) @@ -1985,7 +1985,7 @@ xfs_attr_leaf_lookup_int(xfs_dabuf_t *bp continue; } if (entry->flags & XFS_ATTR_LOCAL) { - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf, probe); + name_loc = xfs_attr_leaf_name_local(leaf, probe); if (name_loc->namelen != args->namelen) continue; if (memcmp(args->name, (char *)name_loc->nameval, args->namelen) != 0) @@ -1995,7 +1995,7 @@ xfs_attr_leaf_lookup_int(xfs_dabuf_t *bp args->index = probe; return(XFS_ERROR(EEXIST)); } else { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, probe); + name_rmt = xfs_attr_leaf_name_remote(leaf, probe); if (name_rmt->namelen != args->namelen) continue; if (memcmp(args->name, (char *)name_rmt->name, @@ -2035,7 +2035,7 @@ xfs_attr_leaf_getvalue(xfs_dabuf_t *bp, entry = &leaf->entries[args->index]; if (entry->flags & XFS_ATTR_LOCAL) { - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf, args->index); + name_loc = xfs_attr_leaf_name_local(leaf, args->index); ASSERT(name_loc->namelen == args->namelen); ASSERT(memcmp(args->name, name_loc->nameval, args->namelen) == 0); valuelen = be16_to_cpu(name_loc->valuelen); @@ -2050,7 +2050,7 @@ xfs_attr_leaf_getvalue(xfs_dabuf_t *bp, args->valuelen = valuelen; memcpy(args->value, &name_loc->nameval[args->namelen], valuelen); } else { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, args->index); + name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); ASSERT(name_rmt->namelen == args->namelen); ASSERT(memcmp(args->name, name_rmt->name, args->namelen) == 0); valuelen = be32_to_cpu(name_rmt->valuelen); @@ -2143,7 +2143,7 @@ xfs_attr_leaf_moveents(xfs_attr_leafbloc * off for 6.2, should be revisited later. */ if (entry_s->flags & XFS_ATTR_INCOMPLETE) { /* skip partials? */ - memset(XFS_ATTR_LEAF_NAME(leaf_s, start_s + i), 0, tmp); + memset(xfs_attr_leaf_name(leaf_s, start_s + i), 0, tmp); be16_add_cpu(&hdr_s->usedbytes, -tmp); be16_add_cpu(&hdr_s->count, -1); entry_d--; /* to compensate for ++ in loop hdr */ @@ -2160,11 +2160,11 @@ xfs_attr_leaf_moveents(xfs_attr_leafbloc entry_d->flags = entry_s->flags; ASSERT(be16_to_cpu(entry_d->nameidx) + tmp <= XFS_LBSIZE(mp)); - memmove(XFS_ATTR_LEAF_NAME(leaf_d, desti), - XFS_ATTR_LEAF_NAME(leaf_s, start_s + i), tmp); + memmove(xfs_attr_leaf_name(leaf_d, desti), + xfs_attr_leaf_name(leaf_s, start_s + i), tmp); ASSERT(be16_to_cpu(entry_s->nameidx) + tmp <= XFS_LBSIZE(mp)); - memset(XFS_ATTR_LEAF_NAME(leaf_s, start_s + i), 0, tmp); + memset(xfs_attr_leaf_name(leaf_s, start_s + i), 0, tmp); be16_add_cpu(&hdr_s->usedbytes, -tmp); be16_add_cpu(&hdr_d->usedbytes, tmp); be16_add_cpu(&hdr_s->count, -1); @@ -2276,12 +2276,12 @@ xfs_attr_leaf_entsize(xfs_attr_leafblock ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_ATTR_LEAF_MAGIC); if (leaf->entries[index].flags & XFS_ATTR_LOCAL) { - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf, index); - size = XFS_ATTR_LEAF_ENTSIZE_LOCAL(name_loc->namelen, + name_loc = xfs_attr_leaf_name_local(leaf, index); + size = xfs_attr_leaf_entsize_local(name_loc->namelen, be16_to_cpu(name_loc->valuelen)); } else { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, index); - size = XFS_ATTR_LEAF_ENTSIZE_REMOTE(name_rmt->namelen); + name_rmt = xfs_attr_leaf_name_remote(leaf, index); + size = xfs_attr_leaf_entsize_remote(name_rmt->namelen); } return(size); } @@ -2297,13 +2297,13 @@ xfs_attr_leaf_newentsize(int namelen, in { int size; - size = XFS_ATTR_LEAF_ENTSIZE_LOCAL(namelen, valuelen); - if (size < XFS_ATTR_LEAF_ENTSIZE_LOCAL_MAX(blocksize)) { + size = xfs_attr_leaf_entsize_local(namelen, valuelen); + if (size < xfs_attr_leaf_entsize_local_max(blocksize)) { if (local) { *local = 1; } } else { - size = XFS_ATTR_LEAF_ENTSIZE_REMOTE(namelen); + size = xfs_attr_leaf_entsize_remote(namelen); if (local) { *local = 0; } @@ -2372,7 +2372,7 @@ xfs_attr_leaf_list_int(xfs_dabuf_t *bp, if (entry->flags & XFS_ATTR_LOCAL) { xfs_attr_leaf_name_local_t *name_loc = - XFS_ATTR_LEAF_NAME_LOCAL(leaf, i); + xfs_attr_leaf_name_local(leaf, i); retval = context->put_listent(context, entry->flags, @@ -2384,7 +2384,7 @@ xfs_attr_leaf_list_int(xfs_dabuf_t *bp, return retval; } else { xfs_attr_leaf_name_remote_t *name_rmt = - XFS_ATTR_LEAF_NAME_REMOTE(leaf, i); + xfs_attr_leaf_name_remote(leaf, i); int valuelen = be32_to_cpu(name_rmt->valuelen); @@ -2468,11 +2468,11 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *a #ifdef DEBUG if (entry->flags & XFS_ATTR_LOCAL) { - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf, args->index); + name_loc = xfs_attr_leaf_name_local(leaf, args->index); namelen = name_loc->namelen; name = (char *)name_loc->nameval; } else { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, args->index); + name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); namelen = name_rmt->namelen; name = (char *)name_rmt->name; } @@ -2487,7 +2487,7 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *a if (args->rmtblkno) { ASSERT((entry->flags & XFS_ATTR_LOCAL) == 0); - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, args->index); + name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); name_rmt->valueblk = cpu_to_be32(args->rmtblkno); name_rmt->valuelen = cpu_to_be32(args->valuelen); xfs_da_log_buf(args->trans, bp, @@ -2534,7 +2534,7 @@ xfs_attr_leaf_setflag(xfs_da_args_t *arg xfs_da_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry))); if ((entry->flags & XFS_ATTR_LOCAL) == 0) { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, args->index); + name_rmt = xfs_attr_leaf_name_remote(leaf, args->index); name_rmt->valueblk = 0; name_rmt->valuelen = 0; xfs_da_log_buf(args->trans, bp, @@ -2607,20 +2607,20 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *a #ifdef DEBUG if (entry1->flags & XFS_ATTR_LOCAL) { - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf1, args->index); + name_loc = xfs_attr_leaf_name_local(leaf1, args->index); namelen1 = name_loc->namelen; name1 = (char *)name_loc->nameval; } else { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf1, args->index); + name_rmt = xfs_attr_leaf_name_remote(leaf1, args->index); namelen1 = name_rmt->namelen; name1 = (char *)name_rmt->name; } if (entry2->flags & XFS_ATTR_LOCAL) { - name_loc = XFS_ATTR_LEAF_NAME_LOCAL(leaf2, args->index2); + name_loc = xfs_attr_leaf_name_local(leaf2, args->index2); namelen2 = name_loc->namelen; name2 = (char *)name_loc->nameval; } else { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf2, args->index2); + name_rmt = xfs_attr_leaf_name_remote(leaf2, args->index2); namelen2 = name_rmt->namelen; name2 = (char *)name_rmt->name; } @@ -2637,7 +2637,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *a XFS_DA_LOGRANGE(leaf1, entry1, sizeof(*entry1))); if (args->rmtblkno) { ASSERT((entry1->flags & XFS_ATTR_LOCAL) == 0); - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf1, args->index); + name_rmt = xfs_attr_leaf_name_remote(leaf1, args->index); name_rmt->valueblk = cpu_to_be32(args->rmtblkno); name_rmt->valuelen = cpu_to_be32(args->valuelen); xfs_da_log_buf(args->trans, bp1, @@ -2648,7 +2648,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *a xfs_da_log_buf(args->trans, bp2, XFS_DA_LOGRANGE(leaf2, entry2, sizeof(*entry2))); if ((entry2->flags & XFS_ATTR_LOCAL) == 0) { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf2, args->index2); + name_rmt = xfs_attr_leaf_name_remote(leaf2, args->index2); name_rmt->valueblk = 0; name_rmt->valuelen = 0; xfs_da_log_buf(args->trans, bp2, @@ -2855,7 +2855,7 @@ xfs_attr_leaf_inactive(xfs_trans_t **tra for (i = 0; i < be16_to_cpu(leaf->hdr.count); entry++, i++) { if (be16_to_cpu(entry->nameidx) && ((entry->flags & XFS_ATTR_LOCAL) == 0)) { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, i); + name_rmt = xfs_attr_leaf_name_remote(leaf, i); if (name_rmt->valueblk) count++; } @@ -2883,7 +2883,7 @@ xfs_attr_leaf_inactive(xfs_trans_t **tra for (i = 0; i < be16_to_cpu(leaf->hdr.count); entry++, i++) { if (be16_to_cpu(entry->nameidx) && ((entry->flags & XFS_ATTR_LOCAL) == 0)) { - name_rmt = XFS_ATTR_LEAF_NAME_REMOTE(leaf, i); + name_rmt = xfs_attr_leaf_name_remote(leaf, i); if (name_rmt->valueblk) { lp->valueblk = be32_to_cpu(name_rmt->valueblk); lp->valuelen = XFS_B_TO_FSB(dp->i_mount, Index: xfs/fs/xfs/xfs_attr_leaf.h =================================================================== --- xfs.orig/fs/xfs/xfs_attr_leaf.h +++ xfs/fs/xfs/xfs_attr_leaf.h @@ -151,8 +151,6 @@ typedef struct xfs_attr_leafblock { /* * Cast typed pointers for "local" and "remote" name/value structs. */ -#define XFS_ATTR_LEAF_NAME_REMOTE(leafp,idx) \ - xfs_attr_leaf_name_remote(leafp,idx) static inline xfs_attr_leaf_name_remote_t * xfs_attr_leaf_name_remote(xfs_attr_leafblock_t *leafp, int idx) { @@ -160,8 +158,6 @@ xfs_attr_leaf_name_remote(xfs_attr_leafb &((char *)leafp)[be16_to_cpu(leafp->entries[idx].nameidx)]; } -#define XFS_ATTR_LEAF_NAME_LOCAL(leafp,idx) \ - xfs_attr_leaf_name_local(leafp,idx) static inline xfs_attr_leaf_name_local_t * xfs_attr_leaf_name_local(xfs_attr_leafblock_t *leafp, int idx) { @@ -169,8 +165,6 @@ xfs_attr_leaf_name_local(xfs_attr_leafbl &((char *)leafp)[be16_to_cpu(leafp->entries[idx].nameidx)]; } -#define XFS_ATTR_LEAF_NAME(leafp,idx) \ - xfs_attr_leaf_name(leafp,idx) static inline char *xfs_attr_leaf_name(xfs_attr_leafblock_t *leafp, int idx) { return &((char *)leafp)[be16_to_cpu(leafp->entries[idx].nameidx)]; @@ -181,24 +175,18 @@ static inline char *xfs_attr_leaf_name(x * a "local" name/value structure, a "remote" name/value structure, and * a pointer which might be either. */ -#define XFS_ATTR_LEAF_ENTSIZE_REMOTE(nlen) \ - xfs_attr_leaf_entsize_remote(nlen) static inline int xfs_attr_leaf_entsize_remote(int nlen) { return ((uint)sizeof(xfs_attr_leaf_name_remote_t) - 1 + (nlen) + \ XFS_ATTR_LEAF_NAME_ALIGN - 1) & ~(XFS_ATTR_LEAF_NAME_ALIGN - 1); } -#define XFS_ATTR_LEAF_ENTSIZE_LOCAL(nlen,vlen) \ - xfs_attr_leaf_entsize_local(nlen,vlen) static inline int xfs_attr_leaf_entsize_local(int nlen, int vlen) { return ((uint)sizeof(xfs_attr_leaf_name_local_t) - 1 + (nlen) + (vlen) + XFS_ATTR_LEAF_NAME_ALIGN - 1) & ~(XFS_ATTR_LEAF_NAME_ALIGN - 1); } -#define XFS_ATTR_LEAF_ENTSIZE_LOCAL_MAX(bsize) \ - xfs_attr_leaf_entsize_local_max(bsize) static inline int xfs_attr_leaf_entsize_local_max(int bsize) { return (((bsize) >> 1) + ((bsize) >> 2)); -- From sandeen@sandeen.net Thu Jan 1 16:41:01 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-3.2 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_102, J_CHICKENPOX_32,J_CHICKENPOX_42,J_CHICKENPOX_44,J_CHICKENPOX_45, J_CHICKENPOX_61,J_CHICKENPOX_62,J_CHICKENPOX_63,J_CHICKENPOX_64, J_CHICKENPOX_66,LOCAL_GNU_PATCH autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01Mf15Q031909 for ; Thu, 1 Jan 2009 16:41:01 -0600 X-ASG-Debug-ID: 1230849657-2e68036f0000-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 4678A1BF8668 for ; Thu, 1 Jan 2009 14:40:57 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id 0HHTRZCzFemoWxKE for ; Thu, 01 Jan 2009 14:40:57 -0800 (PST) Received: by mail.sandeen.net (Postfix, from userid 500) id E4511A84090; Thu, 1 Jan 2009 16:40:57 -0600 (CST) Message-Id: <20090101224057.782251520@sandeen.net> References: <20090101224009.616367334@sandeen.net> User-Agent: quilt/0.46-1 Date: Thu, 01 Jan 2009 16:40:13 -0600 From: Eric Sandeen To: xfs@oss.sgi.com X-ASG-Orig-Subj: [patch 4/4] Remove the rest of the macro-to-function indirections. Subject: [patch 4/4] Remove the rest of the macro-to-function indirections. Content-Disposition: inline; filename=last_shouting X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1230849658 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14183 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Eric Sandeen --- Index: xfs/fs/xfs/quota/xfs_dquot.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_dquot.c +++ xfs/fs/xfs/quota/xfs_dquot.c @@ -421,7 +421,7 @@ xfs_qm_dqalloc( /* * Initialize the bmap freelist prior to calling bmapi code. */ - XFS_BMAP_INIT(&flist, &firstblock); + xfs_bmap_init(&flist, &firstblock); xfs_ilock(quotip, XFS_ILOCK_EXCL); /* * Return if this type of quotas is turned off while we didn't Index: xfs/fs/xfs/xfs_attr.c =================================================================== --- xfs.orig/fs/xfs/xfs_attr.c +++ xfs/fs/xfs/xfs_attr.c @@ -374,7 +374,7 @@ xfs_attr_set_int(xfs_inode_t *dp, struct * It won't fit in the shortform, transform to a leaf block. * GROT: another possible req'mt for a double-split btree op. */ - XFS_BMAP_INIT(args.flist, args.firstblock); + xfs_bmap_init(args.flist, args.firstblock); error = xfs_attr_shortform_to_leaf(&args); if (!error) { error = xfs_bmap_finish(&args.trans, args.flist, @@ -956,7 +956,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *arg * Commit that transaction so that the node_addname() call * can manage its own transactions. */ - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_attr_leaf_to_node(args); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, @@ -1057,7 +1057,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *arg * If the result is small enough, shrink it all into the inode. */ if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) { - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_attr_leaf_to_shortform(bp, args, forkoff); /* bp is gone due to xfs_da_shrink_inode */ if (!error) { @@ -1135,7 +1135,7 @@ xfs_attr_leaf_removename(xfs_da_args_t * * If the result is small enough, shrink it all into the inode. */ if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) { - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_attr_leaf_to_shortform(bp, args, forkoff); /* bp is gone due to xfs_da_shrink_inode */ if (!error) { @@ -1290,7 +1290,7 @@ restart: * have been a b-tree. */ xfs_da_state_free(state); - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_attr_leaf_to_node(args); if (!error) { error = xfs_bmap_finish(&args->trans, @@ -1331,7 +1331,7 @@ restart: * in the index/blkno/rmtblkno/rmtblkcnt fields and * in the index2/blkno2/rmtblkno2/rmtblkcnt2 fields. */ - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_da_split(state); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, @@ -1443,7 +1443,7 @@ restart: * Check to see if the tree needs to be collapsed. */ if (retval && (state->path.active > 1)) { - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_da_join(state); if (!error) { error = xfs_bmap_finish(&args->trans, @@ -1579,7 +1579,7 @@ xfs_attr_node_removename(xfs_da_args_t * * Check to see if the tree needs to be collapsed. */ if (retval && (state->path.active > 1)) { - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_da_join(state); if (!error) { error = xfs_bmap_finish(&args->trans, args->flist, @@ -1630,7 +1630,7 @@ xfs_attr_node_removename(xfs_da_args_t * == XFS_ATTR_LEAF_MAGIC); if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) { - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_attr_leaf_to_shortform(bp, args, forkoff); /* bp is gone due to xfs_da_shrink_inode */ if (!error) { @@ -2069,7 +2069,7 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) /* * Allocate a single extent, up to the size of the value. */ - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); nmap = 1; error = xfs_bmapi(args->trans, dp, (xfs_fileoff_t)lblkno, blkcnt, @@ -2123,7 +2123,7 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) /* * Try to remember where we decided to put the value. */ - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); nmap = 1; error = xfs_bmapi(NULL, dp, (xfs_fileoff_t)lblkno, args->rmtblkcnt, @@ -2188,7 +2188,7 @@ xfs_attr_rmtval_remove(xfs_da_args_t *ar /* * Try to remember where we decided to put the value. */ - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); nmap = 1; error = xfs_bmapi(NULL, args->dp, (xfs_fileoff_t)lblkno, args->rmtblkcnt, @@ -2229,7 +2229,7 @@ xfs_attr_rmtval_remove(xfs_da_args_t *ar blkcnt = args->rmtblkcnt; done = 0; while (!done) { - XFS_BMAP_INIT(args->flist, args->firstblock); + xfs_bmap_init(args->flist, args->firstblock); error = xfs_bunmapi(args->trans, args->dp, lblkno, blkcnt, XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, 1, args->firstblock, args->flist, Index: xfs/fs/xfs/xfs_bmap.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap.c +++ xfs/fs/xfs/xfs_bmap.c @@ -549,9 +549,9 @@ xfs_bmap_add_extent( xfs_iext_insert(ifp, 0, 1, new); ASSERT(cur == NULL); ifp->if_lastex = 0; - if (!ISNULLSTARTBLOCK(new->br_startblock)) { + if (!isnullstartblock(new->br_startblock)) { XFS_IFORK_NEXT_SET(ip, whichfork, 1); - logflags = XFS_ILOG_CORE | XFS_ILOG_FEXT(whichfork); + logflags = XFS_ILOG_CORE | xfs_ilog_fext(whichfork); } else logflags = 0; /* DELTA: single new extent */ @@ -567,7 +567,7 @@ xfs_bmap_add_extent( /* * Any kind of new delayed allocation goes here. */ - else if (ISNULLSTARTBLOCK(new->br_startblock)) { + else if (isnullstartblock(new->br_startblock)) { if (cur) ASSERT((cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL) == 0); @@ -598,11 +598,11 @@ xfs_bmap_add_extent( * in a delayed or unwritten allocation with a real one, or * converting real back to unwritten. */ - if (!ISNULLSTARTBLOCK(new->br_startblock) && + if (!isnullstartblock(new->br_startblock) && new->br_startoff + new->br_blockcount > prev.br_startoff) { if (prev.br_state != XFS_EXT_UNWRITTEN && - ISNULLSTARTBLOCK(prev.br_startblock)) { - da_old = STARTBLOCKVAL(prev.br_startblock); + isnullstartblock(prev.br_startblock)) { + da_old = startblockval(prev.br_startblock); if (cur) ASSERT(cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL); @@ -757,7 +757,7 @@ xfs_bmap_add_extent_delay_real( */ if (STATE_SET_TEST(LEFT_VALID, idx > 0)) { xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &LEFT); - STATE_SET(LEFT_DELAY, ISNULLSTARTBLOCK(LEFT.br_startblock)); + STATE_SET(LEFT_DELAY, isnullstartblock(LEFT.br_startblock)); } STATE_SET(LEFT_CONTIG, STATE_TEST(LEFT_VALID) && !STATE_TEST(LEFT_DELAY) && @@ -774,7 +774,7 @@ xfs_bmap_add_extent_delay_real( idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1)) { xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx + 1), &RIGHT); - STATE_SET(RIGHT_DELAY, ISNULLSTARTBLOCK(RIGHT.br_startblock)); + STATE_SET(RIGHT_DELAY, isnullstartblock(RIGHT.br_startblock)); } STATE_SET(RIGHT_CONTIG, STATE_TEST(RIGHT_VALID) && !STATE_TEST(RIGHT_DELAY) && @@ -973,8 +973,8 @@ xfs_bmap_add_extent_delay_real( goto done; } temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), - STARTBLOCKVAL(PREV.br_startblock)); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); + startblockval(PREV.br_startblock)); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); XFS_BMAP_TRACE_POST_UPDATE("LF|LC", ip, idx, XFS_DATA_FORK); *dnew = temp; /* DELTA: The boundary between two in-core extents moved. */ @@ -1021,10 +1021,10 @@ xfs_bmap_add_extent_delay_real( goto done; } temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), - STARTBLOCKVAL(PREV.br_startblock) - + startblockval(PREV.br_startblock) - (cur ? cur->bc_private.b.allocated : 0)); ep = xfs_iext_get_ext(ifp, idx + 1); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); XFS_BMAP_TRACE_POST_UPDATE("LF", ip, idx + 1, XFS_DATA_FORK); *dnew = temp; /* DELTA: One in-core extent is split in two. */ @@ -1064,8 +1064,8 @@ xfs_bmap_add_extent_delay_real( goto done; } temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), - STARTBLOCKVAL(PREV.br_startblock)); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); + startblockval(PREV.br_startblock)); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); XFS_BMAP_TRACE_POST_UPDATE("RF|RC", ip, idx, XFS_DATA_FORK); *dnew = temp; /* DELTA: The boundary between two in-core extents moved. */ @@ -1111,10 +1111,10 @@ xfs_bmap_add_extent_delay_real( goto done; } temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), - STARTBLOCKVAL(PREV.br_startblock) - + startblockval(PREV.br_startblock) - (cur ? cur->bc_private.b.allocated : 0)); ep = xfs_iext_get_ext(ifp, idx); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); XFS_BMAP_TRACE_POST_UPDATE("RF", ip, idx, XFS_DATA_FORK); *dnew = temp; /* DELTA: One in-core extent is split in two. */ @@ -1167,7 +1167,7 @@ xfs_bmap_add_extent_delay_real( } temp = xfs_bmap_worst_indlen(ip, temp); temp2 = xfs_bmap_worst_indlen(ip, temp2); - diff = (int)(temp + temp2 - STARTBLOCKVAL(PREV.br_startblock) - + diff = (int)(temp + temp2 - startblockval(PREV.br_startblock) - (cur ? cur->bc_private.b.allocated : 0)); if (diff > 0 && xfs_mod_incore_sb(ip->i_mount, XFS_SBS_FDBLOCKS, -((int64_t)diff), rsvd)) { @@ -1195,11 +1195,11 @@ xfs_bmap_add_extent_delay_real( } } ep = xfs_iext_get_ext(ifp, idx); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); XFS_BMAP_TRACE_POST_UPDATE("0", ip, idx, XFS_DATA_FORK); XFS_BMAP_TRACE_PRE_UPDATE("0", ip, idx + 2, XFS_DATA_FORK); xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx + 2), - NULLSTARTBLOCK((int)temp2)); + nullstartblock((int)temp2)); XFS_BMAP_TRACE_POST_UPDATE("0", ip, idx + 2, XFS_DATA_FORK); *dnew = temp + temp2; /* DELTA: One in-core extent is split in three. */ @@ -1319,7 +1319,7 @@ xfs_bmap_add_extent_unwritten_real( */ if (STATE_SET_TEST(LEFT_VALID, idx > 0)) { xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &LEFT); - STATE_SET(LEFT_DELAY, ISNULLSTARTBLOCK(LEFT.br_startblock)); + STATE_SET(LEFT_DELAY, isnullstartblock(LEFT.br_startblock)); } STATE_SET(LEFT_CONTIG, STATE_TEST(LEFT_VALID) && !STATE_TEST(LEFT_DELAY) && @@ -1336,7 +1336,7 @@ xfs_bmap_add_extent_unwritten_real( idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1)) { xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx + 1), &RIGHT); - STATE_SET(RIGHT_DELAY, ISNULLSTARTBLOCK(RIGHT.br_startblock)); + STATE_SET(RIGHT_DELAY, isnullstartblock(RIGHT.br_startblock)); } STATE_SET(RIGHT_CONTIG, STATE_TEST(RIGHT_VALID) && !STATE_TEST(RIGHT_DELAY) && @@ -1843,13 +1843,13 @@ xfs_bmap_add_extent_hole_delay( ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); ep = xfs_iext_get_ext(ifp, idx); state = 0; - ASSERT(ISNULLSTARTBLOCK(new->br_startblock)); + ASSERT(isnullstartblock(new->br_startblock)); /* * Check and set flags if this segment has a left neighbor */ if (STATE_SET_TEST(LEFT_VALID, idx > 0)) { xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &left); - STATE_SET(LEFT_DELAY, ISNULLSTARTBLOCK(left.br_startblock)); + STATE_SET(LEFT_DELAY, isnullstartblock(left.br_startblock)); } /* * Check and set flags if the current (right) segment exists. @@ -1859,7 +1859,7 @@ xfs_bmap_add_extent_hole_delay( idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t))) { xfs_bmbt_get_all(ep, &right); - STATE_SET(RIGHT_DELAY, ISNULLSTARTBLOCK(right.br_startblock)); + STATE_SET(RIGHT_DELAY, isnullstartblock(right.br_startblock)); } /* * Set contiguity flags on the left and right neighbors. @@ -1892,12 +1892,12 @@ xfs_bmap_add_extent_hole_delay( XFS_BMAP_TRACE_PRE_UPDATE("LC|RC", ip, idx - 1, XFS_DATA_FORK); xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), temp); - oldlen = STARTBLOCKVAL(left.br_startblock) + - STARTBLOCKVAL(new->br_startblock) + - STARTBLOCKVAL(right.br_startblock); + oldlen = startblockval(left.br_startblock) + + startblockval(new->br_startblock) + + startblockval(right.br_startblock); newlen = xfs_bmap_worst_indlen(ip, temp); xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx - 1), - NULLSTARTBLOCK((int)newlen)); + nullstartblock((int)newlen)); XFS_BMAP_TRACE_POST_UPDATE("LC|RC", ip, idx - 1, XFS_DATA_FORK); XFS_BMAP_TRACE_DELETE("LC|RC", ip, idx, 1, XFS_DATA_FORK); @@ -1918,11 +1918,11 @@ xfs_bmap_add_extent_hole_delay( XFS_BMAP_TRACE_PRE_UPDATE("LC", ip, idx - 1, XFS_DATA_FORK); xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), temp); - oldlen = STARTBLOCKVAL(left.br_startblock) + - STARTBLOCKVAL(new->br_startblock); + oldlen = startblockval(left.br_startblock) + + startblockval(new->br_startblock); newlen = xfs_bmap_worst_indlen(ip, temp); xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx - 1), - NULLSTARTBLOCK((int)newlen)); + nullstartblock((int)newlen)); XFS_BMAP_TRACE_POST_UPDATE("LC", ip, idx - 1, XFS_DATA_FORK); ip->i_df.if_lastex = idx - 1; @@ -1939,11 +1939,11 @@ xfs_bmap_add_extent_hole_delay( */ XFS_BMAP_TRACE_PRE_UPDATE("RC", ip, idx, XFS_DATA_FORK); temp = new->br_blockcount + right.br_blockcount; - oldlen = STARTBLOCKVAL(new->br_startblock) + - STARTBLOCKVAL(right.br_startblock); + oldlen = startblockval(new->br_startblock) + + startblockval(right.br_startblock); newlen = xfs_bmap_worst_indlen(ip, temp); xfs_bmbt_set_allf(ep, new->br_startoff, - NULLSTARTBLOCK((int)newlen), temp, right.br_state); + nullstartblock((int)newlen), temp, right.br_state); XFS_BMAP_TRACE_POST_UPDATE("RC", ip, idx, XFS_DATA_FORK); ip->i_df.if_lastex = idx; /* DELTA: One in-core extent grew into a hole. */ @@ -2039,7 +2039,7 @@ xfs_bmap_add_extent_hole_real( */ if (STATE_SET_TEST(LEFT_VALID, idx > 0)) { xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &left); - STATE_SET(LEFT_DELAY, ISNULLSTARTBLOCK(left.br_startblock)); + STATE_SET(LEFT_DELAY, isnullstartblock(left.br_startblock)); } /* * Check and set flags if this segment has a current value. @@ -2049,7 +2049,7 @@ xfs_bmap_add_extent_hole_real( idx < ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t))) { xfs_bmbt_get_all(ep, &right); - STATE_SET(RIGHT_DELAY, ISNULLSTARTBLOCK(right.br_startblock)); + STATE_SET(RIGHT_DELAY, isnullstartblock(right.br_startblock)); } /* * We're inserting a real allocation between "left" and "right". @@ -2097,7 +2097,7 @@ xfs_bmap_add_extent_hole_real( XFS_IFORK_NEXT_SET(ip, whichfork, XFS_IFORK_NEXTENTS(ip, whichfork) - 1); if (cur == NULL) { - rval = XFS_ILOG_CORE | XFS_ILOG_FEXT(whichfork); + rval = XFS_ILOG_CORE | xfs_ilog_fext(whichfork); } else { rval = XFS_ILOG_CORE; if ((error = xfs_bmbt_lookup_eq(cur, @@ -2139,7 +2139,7 @@ xfs_bmap_add_extent_hole_real( XFS_BMAP_TRACE_POST_UPDATE("LC", ip, idx - 1, whichfork); ifp->if_lastex = idx - 1; if (cur == NULL) { - rval = XFS_ILOG_FEXT(whichfork); + rval = xfs_ilog_fext(whichfork); } else { rval = 0; if ((error = xfs_bmbt_lookup_eq(cur, @@ -2174,7 +2174,7 @@ xfs_bmap_add_extent_hole_real( XFS_BMAP_TRACE_POST_UPDATE("RC", ip, idx, whichfork); ifp->if_lastex = idx; if (cur == NULL) { - rval = XFS_ILOG_FEXT(whichfork); + rval = xfs_ilog_fext(whichfork); } else { rval = 0; if ((error = xfs_bmbt_lookup_eq(cur, @@ -2208,7 +2208,7 @@ xfs_bmap_add_extent_hole_real( XFS_IFORK_NEXT_SET(ip, whichfork, XFS_IFORK_NEXTENTS(ip, whichfork) + 1); if (cur == NULL) { - rval = XFS_ILOG_CORE | XFS_ILOG_FEXT(whichfork); + rval = XFS_ILOG_CORE | xfs_ilog_fext(whichfork); } else { rval = XFS_ILOG_CORE; if ((error = xfs_bmbt_lookup_eq(cur, @@ -2436,7 +2436,7 @@ xfs_bmap_adjacent( * try to use it's last block as our starting point. */ if (ap->eof && ap->prevp->br_startoff != NULLFILEOFF && - !ISNULLSTARTBLOCK(ap->prevp->br_startblock) && + !isnullstartblock(ap->prevp->br_startblock) && ISVALID(ap->prevp->br_startblock + ap->prevp->br_blockcount, ap->prevp->br_startblock)) { ap->rval = ap->prevp->br_startblock + ap->prevp->br_blockcount; @@ -2465,7 +2465,7 @@ xfs_bmap_adjacent( * start block based on it. */ if (ap->prevp->br_startoff != NULLFILEOFF && - !ISNULLSTARTBLOCK(ap->prevp->br_startblock) && + !isnullstartblock(ap->prevp->br_startblock) && (prevbno = ap->prevp->br_startblock + ap->prevp->br_blockcount) && ISVALID(prevbno, ap->prevp->br_startblock)) { @@ -2506,7 +2506,7 @@ xfs_bmap_adjacent( * If there's a following (right) block, select a requested * start block based on it. */ - if (!ISNULLSTARTBLOCK(ap->gotp->br_startblock)) { + if (!isnullstartblock(ap->gotp->br_startblock)) { /* * Calculate gap to start of next block. */ @@ -3036,7 +3036,7 @@ xfs_bmap_btree_to_extents( ASSERT(ifp->if_broot == NULL); ASSERT((ifp->if_flags & XFS_IFBROOT) == 0); XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS); - *logflagsp = XFS_ILOG_CORE | XFS_ILOG_FEXT(whichfork); + *logflagsp = XFS_ILOG_CORE | xfs_ilog_fext(whichfork); return 0; } @@ -3090,8 +3090,8 @@ xfs_bmap_del_extent( del_endoff = del->br_startoff + del->br_blockcount; got_endoff = got.br_startoff + got.br_blockcount; ASSERT(got_endoff >= del_endoff); - delay = ISNULLSTARTBLOCK(got.br_startblock); - ASSERT(ISNULLSTARTBLOCK(del->br_startblock) == delay); + delay = isnullstartblock(got.br_startblock); + ASSERT(isnullstartblock(del->br_startblock) == delay); flags = 0; qfield = 0; error = 0; @@ -3143,7 +3143,7 @@ xfs_bmap_del_extent( } da_old = da_new = 0; } else { - da_old = STARTBLOCKVAL(got.br_startblock); + da_old = startblockval(got.br_startblock); da_new = 0; nblks = 0; do_fx = 0; @@ -3167,7 +3167,7 @@ xfs_bmap_del_extent( XFS_IFORK_NEXTENTS(ip, whichfork) - 1); flags |= XFS_ILOG_CORE; if (!cur) { - flags |= XFS_ILOG_FEXT(whichfork); + flags |= xfs_ilog_fext(whichfork); break; } if ((error = xfs_bmbt_delete(cur, &i))) @@ -3187,7 +3187,7 @@ xfs_bmap_del_extent( if (delay) { temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), da_old); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); XFS_BMAP_TRACE_POST_UPDATE("2", ip, idx, whichfork); da_new = temp; @@ -3196,7 +3196,7 @@ xfs_bmap_del_extent( xfs_bmbt_set_startblock(ep, del_endblock); XFS_BMAP_TRACE_POST_UPDATE("2", ip, idx, whichfork); if (!cur) { - flags |= XFS_ILOG_FEXT(whichfork); + flags |= xfs_ilog_fext(whichfork); break; } if ((error = xfs_bmbt_update(cur, del_endoff, del_endblock, @@ -3216,7 +3216,7 @@ xfs_bmap_del_extent( if (delay) { temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), da_old); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); XFS_BMAP_TRACE_POST_UPDATE("1", ip, idx, whichfork); da_new = temp; @@ -3224,7 +3224,7 @@ xfs_bmap_del_extent( } XFS_BMAP_TRACE_POST_UPDATE("1", ip, idx, whichfork); if (!cur) { - flags |= XFS_ILOG_FEXT(whichfork); + flags |= xfs_ilog_fext(whichfork); break; } if ((error = xfs_bmbt_update(cur, got.br_startoff, @@ -3299,22 +3299,22 @@ xfs_bmap_del_extent( } XFS_WANT_CORRUPTED_GOTO(i == 1, done); } else - flags |= XFS_ILOG_FEXT(whichfork); + flags |= xfs_ilog_fext(whichfork); XFS_IFORK_NEXT_SET(ip, whichfork, XFS_IFORK_NEXTENTS(ip, whichfork) + 1); } else { ASSERT(whichfork == XFS_DATA_FORK); temp = xfs_bmap_worst_indlen(ip, temp); - xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp)); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); temp2 = xfs_bmap_worst_indlen(ip, temp2); - new.br_startblock = NULLSTARTBLOCK((int)temp2); + new.br_startblock = nullstartblock((int)temp2); da_new = temp + temp2; while (da_new > da_old) { if (temp) { temp--; da_new--; xfs_bmbt_set_startblock(ep, - NULLSTARTBLOCK((int)temp)); + nullstartblock((int)temp)); } if (da_new == da_old) break; @@ -3322,7 +3322,7 @@ xfs_bmap_del_extent( temp2--; da_new--; new.br_startblock = - NULLSTARTBLOCK((int)temp2); + nullstartblock((int)temp2); } } } @@ -3498,7 +3498,7 @@ xfs_bmap_extents_to_btree( nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); for (cnt = i = 0; i < nextents; i++) { ep = xfs_iext_get_ext(ifp, i); - if (!ISNULLSTARTBLOCK(xfs_bmbt_get_startblock(ep))) { + if (!isnullstartblock(xfs_bmbt_get_startblock(ep))) { arp->l0 = cpu_to_be64(ep->l0); arp->l1 = cpu_to_be64(ep->l1); arp++; cnt++; @@ -3522,7 +3522,7 @@ xfs_bmap_extents_to_btree( xfs_bmbt_log_recs(cur, abp, 1, be16_to_cpu(ablock->bb_numrecs)); ASSERT(*curp == NULL); *curp = cur; - *logflagsp = XFS_ILOG_CORE | XFS_ILOG_FBROOT(whichfork); + *logflagsp = XFS_ILOG_CORE | xfs_ilog_fbroot(whichfork); return 0; } @@ -3626,7 +3626,7 @@ xfs_bmap_local_to_extents( ip->i_d.di_nblocks = 1; XFS_TRANS_MOD_DQUOT_BYINO(args.mp, tp, ip, XFS_TRANS_DQ_BCOUNT, 1L); - flags |= XFS_ILOG_FEXT(whichfork); + flags |= xfs_ilog_fext(whichfork); } else { ASSERT(XFS_IFORK_NEXTENTS(ip, whichfork) == 0); xfs_bmap_forkoff_reset(ip->i_mount, ip, whichfork); @@ -4032,7 +4032,7 @@ xfs_bmap_add_attrfork( XFS_IFORK_ASIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t); ip->i_afp->if_flags = XFS_IFEXTENTS; logflags = 0; - XFS_BMAP_INIT(&flist, &firstblock); + xfs_bmap_init(&flist, &firstblock); switch (ip->i_d.di_format) { case XFS_DINODE_FMT_LOCAL: error = xfs_bmap_add_attrfork_local(tp, ip, &firstblock, &flist, @@ -4112,7 +4112,7 @@ xfs_bmap_add_free( ASSERT(bno != NULLFSBLOCK); ASSERT(len > 0); ASSERT(len <= MAXEXTLEN); - ASSERT(!ISNULLSTARTBLOCK(bno)); + ASSERT(!isnullstartblock(bno)); agno = XFS_FSB_TO_AGNO(mp, bno); agbno = XFS_FSB_TO_AGBNO(mp, bno); ASSERT(agno < mp->m_sb.sb_agcount); @@ -4837,7 +4837,7 @@ xfs_bmapi( got.br_startoff = end; inhole = eof || got.br_startoff > bno; wasdelay = wr && !inhole && !(flags & XFS_BMAPI_DELAY) && - ISNULLSTARTBLOCK(got.br_startblock); + isnullstartblock(got.br_startblock); /* * First, deal with the hole before the allocated space * that we found, if any. @@ -4956,7 +4956,7 @@ xfs_bmapi( } ip->i_delayed_blks += alen; - abno = NULLSTARTBLOCK(indlen); + abno = nullstartblock(indlen); } else { /* * If first time, allocate and fill in @@ -5073,8 +5073,8 @@ xfs_bmapi( aoff + alen); #ifdef DEBUG if (flags & XFS_BMAPI_DELAY) { - ASSERT(ISNULLSTARTBLOCK(got.br_startblock)); - ASSERT(STARTBLOCKVAL(got.br_startblock) > 0); + ASSERT(isnullstartblock(got.br_startblock)); + ASSERT(startblockval(got.br_startblock) > 0); } ASSERT(got.br_state == XFS_EXT_NORM || got.br_state == XFS_EXT_UNWRITTEN); @@ -5108,7 +5108,7 @@ xfs_bmapi( ASSERT((bno >= obno) || (n == 0)); ASSERT(bno < end); mval->br_startoff = bno; - if (ISNULLSTARTBLOCK(got.br_startblock)) { + if (isnullstartblock(got.br_startblock)) { ASSERT(!wr || (flags & XFS_BMAPI_DELAY)); mval->br_startblock = DELAYSTARTBLOCK; } else @@ -5130,7 +5130,7 @@ xfs_bmapi( ASSERT(mval->br_blockcount <= len); } else { *mval = got; - if (ISNULLSTARTBLOCK(mval->br_startblock)) { + if (isnullstartblock(mval->br_startblock)) { ASSERT(!wr || (flags & XFS_BMAPI_DELAY)); mval->br_startblock = DELAYSTARTBLOCK; } @@ -5259,12 +5259,12 @@ error0: * Log everything. Do this after conversion, there's no point in * logging the extent records if we've converted to btree format. */ - if ((logflags & XFS_ILOG_FEXT(whichfork)) && + if ((logflags & xfs_ilog_fext(whichfork)) && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS) - logflags &= ~XFS_ILOG_FEXT(whichfork); - else if ((logflags & XFS_ILOG_FBROOT(whichfork)) && + logflags &= ~xfs_ilog_fext(whichfork); + else if ((logflags & xfs_ilog_fbroot(whichfork)) && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE) - logflags &= ~XFS_ILOG_FBROOT(whichfork); + logflags &= ~xfs_ilog_fbroot(whichfork); /* * Log whatever the flags say, even if error. Otherwise we might miss * detecting a case where the data is changed, there's an error, @@ -5341,7 +5341,7 @@ xfs_bmapi_single( *fsb = NULLFSBLOCK; return 0; } - ASSERT(!ISNULLSTARTBLOCK(got.br_startblock)); + ASSERT(!isnullstartblock(got.br_startblock)); ASSERT(bno < got.br_startoff + got.br_blockcount); *fsb = got.br_startblock + (bno - got.br_startoff); ifp->if_lastex = lastx; @@ -5474,7 +5474,7 @@ xfs_bunmapi( */ ASSERT(ep != NULL); del = got; - wasdel = ISNULLSTARTBLOCK(del.br_startblock); + wasdel = isnullstartblock(del.br_startblock); if (got.br_startoff < start) { del.br_startoff = start; del.br_blockcount -= start - got.br_startoff; @@ -5569,7 +5569,7 @@ xfs_bunmapi( xfs_bmbt_get_all(xfs_iext_get_ext(ifp, lastx - 1), &prev); ASSERT(prev.br_state == XFS_EXT_NORM); - ASSERT(!ISNULLSTARTBLOCK(prev.br_startblock)); + ASSERT(!isnullstartblock(prev.br_startblock)); ASSERT(del.br_startblock == prev.br_startblock + prev.br_blockcount); if (prev.br_startoff < start) { @@ -5597,7 +5597,7 @@ xfs_bunmapi( } } if (wasdel) { - ASSERT(STARTBLOCKVAL(del.br_startblock) > 0); + ASSERT(startblockval(del.br_startblock) > 0); /* Update realtime/data freespace, unreserve quota */ if (isrt) { xfs_filblks_t rtexts; @@ -5713,12 +5713,12 @@ error0: * Log everything. Do this after conversion, there's no point in * logging the extent records if we've converted to btree format. */ - if ((logflags & XFS_ILOG_FEXT(whichfork)) && + if ((logflags & xfs_ilog_fext(whichfork)) && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS) - logflags &= ~XFS_ILOG_FEXT(whichfork); - else if ((logflags & XFS_ILOG_FBROOT(whichfork)) && + logflags &= ~xfs_ilog_fext(whichfork); + else if ((logflags & xfs_ilog_fbroot(whichfork)) && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE) - logflags &= ~XFS_ILOG_FBROOT(whichfork); + logflags &= ~xfs_ilog_fbroot(whichfork); /* * Log inode even in the error case, if the transaction * is dirty we'll need to shut down the filesystem. @@ -5763,7 +5763,7 @@ xfs_getbmapx_fix_eof_hole( out->bmv_length = fixlen; } } else { - out->bmv_block = XFS_FSB_TO_DB(ip, startblock); + out->bmv_block = xfs_fsb_to_db(ip, startblock); } return 1; @@ -5895,7 +5895,7 @@ xfs_getbmap( if (nex > XFS_IFORK_NEXTENTS(ip, whichfork) * 2 + 1) nex = XFS_IFORK_NEXTENTS(ip, whichfork) * 2 + 1; - bmapi_flags = XFS_BMAPI_AFLAG(whichfork) | + bmapi_flags = xfs_bmapi_aflag(whichfork) | ((sh_unwritten) ? 0 : XFS_BMAPI_IGSTATE); /* @@ -6023,7 +6023,7 @@ xfs_bmap_isaeof( */ *aeof = (off >= s.br_startoff && off < s.br_startoff + s.br_blockcount && - ISNULLSTARTBLOCK(s.br_startblock)) || + isnullstartblock(s.br_startblock)) || off >= s.br_startoff + s.br_blockcount; return 0; } Index: xfs/fs/xfs/xfs_bmap.h =================================================================== --- xfs.orig/fs/xfs/xfs_bmap.h +++ xfs/fs/xfs/xfs_bmap.h @@ -95,7 +95,6 @@ typedef struct xfs_bmap_free /* need write cache flushing and no */ /* additional allocation alignments */ -#define XFS_BMAPI_AFLAG(w) xfs_bmapi_aflag(w) static inline int xfs_bmapi_aflag(int w) { return (w == XFS_ATTR_FORK ? XFS_BMAPI_ATTRFORK : 0); @@ -107,7 +106,6 @@ static inline int xfs_bmapi_aflag(int w) #define DELAYSTARTBLOCK ((xfs_fsblock_t)-1LL) #define HOLESTARTBLOCK ((xfs_fsblock_t)-2LL) -#define XFS_BMAP_INIT(flp,fbp) xfs_bmap_init(flp,fbp) static inline void xfs_bmap_init(xfs_bmap_free_t *flp, xfs_fsblock_t *fbp) { ((flp)->xbf_first = NULL, (flp)->xbf_count = 0, \ Index: xfs/fs/xfs/xfs_bmap_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap_btree.c +++ xfs/fs/xfs/xfs_bmap_btree.c @@ -949,7 +949,7 @@ xfs_bmbt_killroot( cur->bc_bufs[level - 1] = NULL; be16_add_cpu(&block->bb_level, -1); xfs_trans_log_inode(cur->bc_tp, ip, - XFS_ILOG_CORE | XFS_ILOG_FBROOT(cur->bc_private.b.whichfork)); + XFS_ILOG_CORE | xfs_ilog_fbroot(cur->bc_private.b.whichfork)); cur->bc_nlevels--; XFS_BMBT_TRACE_CURSOR(cur, EXIT); return 0; @@ -986,7 +986,7 @@ xfs_bmbt_log_keys( ip = cur->bc_private.b.ip; xfs_trans_log_inode(tp, ip, - XFS_ILOG_FBROOT(cur->bc_private.b.whichfork)); + xfs_ilog_fbroot(cur->bc_private.b.whichfork)); } XFS_BMBT_TRACE_CURSOR(cur, EXIT); } @@ -1022,7 +1022,7 @@ xfs_bmbt_log_ptrs( ip = cur->bc_private.b.ip; xfs_trans_log_inode(tp, ip, - XFS_ILOG_FBROOT(cur->bc_private.b.whichfork)); + xfs_ilog_fbroot(cur->bc_private.b.whichfork)); } XFS_BMBT_TRACE_CURSOR(cur, EXIT); } @@ -1838,7 +1838,7 @@ __xfs_bmbt_get_all( b = (((xfs_dfsbno_t)l0 & xfs_mask64lo(9)) << 43) | (((xfs_dfsbno_t)l1) >> 21); - ASSERT((b >> 32) == 0 || ISNULLDSTARTBLOCK(b)); + ASSERT((b >> 32) == 0 || isnulldstartblock(b)); s->br_startblock = (xfs_fsblock_t)b; } #else /* !DEBUG */ @@ -1914,7 +1914,7 @@ xfs_bmbt_get_startblock( b = (((xfs_dfsbno_t)r->l0 & xfs_mask64lo(9)) << 43) | (((xfs_dfsbno_t)r->l1) >> 21); - ASSERT((b >> 32) == 0 || ISNULLDSTARTBLOCK(b)); + ASSERT((b >> 32) == 0 || isnulldstartblock(b)); return (xfs_fsblock_t)b; #else /* !DEBUG */ return (xfs_fsblock_t)(((xfs_dfsbno_t)r->l1) >> 21); @@ -2146,7 +2146,7 @@ xfs_bmbt_log_block( xfs_trans_log_buf(tp, bp, first, last); } else xfs_trans_log_inode(tp, cur->bc_private.b.ip, - XFS_ILOG_FBROOT(cur->bc_private.b.whichfork)); + xfs_ilog_fbroot(cur->bc_private.b.whichfork)); XFS_BMBT_TRACE_CURSOR(cur, EXIT); } @@ -2312,7 +2312,7 @@ xfs_bmbt_newroot( xfs_bmbt_log_ptrs(cur, bp, 1, be16_to_cpu(cblock->bb_numrecs)); XFS_BMBT_TRACE_CURSOR(cur, EXIT); *logflags |= - XFS_ILOG_CORE | XFS_ILOG_FBROOT(cur->bc_private.b.whichfork); + XFS_ILOG_CORE | xfs_ilog_fbroot(cur->bc_private.b.whichfork); *stat = 1; return 0; } @@ -2344,7 +2344,7 @@ xfs_bmbt_set_allf( ((xfs_bmbt_rec_base_t)blockcount & (xfs_bmbt_rec_base_t)xfs_mask64lo(21)); #else /* !XFS_BIG_BLKNOS */ - if (ISNULLSTARTBLOCK(startblock)) { + if (isnullstartblock(startblock)) { r->l0 = ((xfs_bmbt_rec_base_t)extent_flag << 63) | ((xfs_bmbt_rec_base_t)startoff << 9) | (xfs_bmbt_rec_base_t)xfs_mask64lo(9); @@ -2404,7 +2404,7 @@ xfs_bmbt_disk_set_allf( ((xfs_bmbt_rec_base_t)blockcount & (xfs_bmbt_rec_base_t)xfs_mask64lo(21))); #else /* !XFS_BIG_BLKNOS */ - if (ISNULLSTARTBLOCK(startblock)) { + if (isnullstartblock(startblock)) { r->l0 = cpu_to_be64( ((xfs_bmbt_rec_base_t)extent_flag << 63) | ((xfs_bmbt_rec_base_t)startoff << 9) | @@ -2465,7 +2465,7 @@ xfs_bmbt_set_startblock( r->l1 = (r->l1 & (xfs_bmbt_rec_base_t)xfs_mask64lo(21)) | (xfs_bmbt_rec_base_t)(v << 21); #else /* !XFS_BIG_BLKNOS */ - if (ISNULLSTARTBLOCK(v)) { + if (isnullstartblock(v)) { r->l0 |= (xfs_bmbt_rec_base_t)xfs_mask64lo(9); r->l1 = (xfs_bmbt_rec_base_t)xfs_mask64hi(11) | ((xfs_bmbt_rec_base_t)v << 21) | Index: xfs/fs/xfs/xfs_bmap_btree.h =================================================================== --- xfs.orig/fs/xfs/xfs_bmap_btree.h +++ xfs/fs/xfs/xfs_bmap_btree.h @@ -75,26 +75,22 @@ typedef struct xfs_bmbt_rec_host { #define DSTARTBLOCKMASK \ (((((xfs_dfsbno_t)1) << DSTARTBLOCKMASKBITS) - 1) << STARTBLOCKVALBITS) -#define ISNULLSTARTBLOCK(x) isnullstartblock(x) static inline int isnullstartblock(xfs_fsblock_t x) { return ((x) & STARTBLOCKMASK) == STARTBLOCKMASK; } -#define ISNULLDSTARTBLOCK(x) isnulldstartblock(x) static inline int isnulldstartblock(xfs_dfsbno_t x) { return ((x) & DSTARTBLOCKMASK) == DSTARTBLOCKMASK; } -#define NULLSTARTBLOCK(k) nullstartblock(k) static inline xfs_fsblock_t nullstartblock(int k) { ASSERT(k < (1 << STARTBLOCKVALBITS)); return STARTBLOCKMASK | (k); } -#define STARTBLOCKVAL(x) startblockval(x) static inline xfs_filblks_t startblockval(xfs_fsblock_t x) { return (xfs_filblks_t)((x) & ~STARTBLOCKMASK); Index: xfs/fs/xfs/xfs_da_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_da_btree.c +++ xfs/fs/xfs/xfs_da_btree.c @@ -1594,7 +1594,7 @@ xfs_da_grow_inode(xfs_da_args_t *args, x nmap = 1; ASSERT(args->firstblock != NULL); if ((error = xfs_bmapi(tp, dp, bno, count, - XFS_BMAPI_AFLAG(w)|XFS_BMAPI_WRITE|XFS_BMAPI_METADATA| + xfs_bmapi_aflag(w)|XFS_BMAPI_WRITE|XFS_BMAPI_METADATA| XFS_BMAPI_CONTIG, args->firstblock, args->total, &map, &nmap, args->flist, NULL))) { @@ -1615,7 +1615,7 @@ xfs_da_grow_inode(xfs_da_args_t *args, x nmap = MIN(XFS_BMAP_MAX_NMAP, count); c = (int)(bno + count - b); if ((error = xfs_bmapi(tp, dp, b, c, - XFS_BMAPI_AFLAG(w)|XFS_BMAPI_WRITE| + xfs_bmapi_aflag(w)|XFS_BMAPI_WRITE| XFS_BMAPI_METADATA, args->firstblock, args->total, &mapp[mapi], &nmap, args->flist, @@ -1877,7 +1877,7 @@ xfs_da_shrink_inode(xfs_da_args_t *args, * the last block to the place we want to kill. */ if ((error = xfs_bunmapi(tp, dp, dead_blkno, count, - XFS_BMAPI_AFLAG(w)|XFS_BMAPI_METADATA, + xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA, 0, args->firstblock, args->flist, NULL, &done)) == ENOSPC) { if (w != XFS_DATA_FORK) @@ -1982,7 +1982,7 @@ xfs_da_do_buf( if ((error = xfs_bmapi(trans, dp, (xfs_fileoff_t)bno, nfsb, XFS_BMAPI_METADATA | - XFS_BMAPI_AFLAG(whichfork), + xfs_bmapi_aflag(whichfork), NULL, 0, mapp, &nmap, NULL, NULL))) goto exit0; } Index: xfs/fs/xfs/xfs_ialloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_ialloc.c +++ xfs/fs/xfs/xfs_ialloc.c @@ -315,7 +315,7 @@ xfs_ialloc_ag_alloc( */ xfs_biozero(fbuf, 0, ninodes << args.mp->m_sb.sb_inodelog); for (i = 0; i < ninodes; i++) { - free = XFS_MAKE_IPTR(args.mp, fbuf, i); + free = xfs_make_iptr(args.mp, fbuf, i); free->di_core.di_magic = cpu_to_be16(XFS_DINODE_MAGIC); free->di_core.di_version = version; free->di_core.di_gen = cpu_to_be32(gen); @@ -898,7 +898,7 @@ nextag: } } } - offset = XFS_IALLOC_FIND_FREE(&rec.ir_free); + offset = xfs_ialloc_find_free(&rec.ir_free); ASSERT(offset >= 0); ASSERT(offset < XFS_INODES_PER_CHUNK); ASSERT((XFS_AGINO_TO_OFFSET(mp, rec.ir_startino) % Index: xfs/fs/xfs/xfs_ialloc.h =================================================================== --- xfs.orig/fs/xfs/xfs_ialloc.h +++ xfs/fs/xfs/xfs_ialloc.h @@ -38,7 +38,6 @@ struct xfs_trans; /* * Make an inode pointer out of the buffer/offset. */ -#define XFS_MAKE_IPTR(mp,b,o) xfs_make_iptr(mp,b,o) static inline struct xfs_dinode * xfs_make_iptr(struct xfs_mount *mp, struct xfs_buf *b, int o) { @@ -49,7 +48,6 @@ xfs_make_iptr(struct xfs_mount *mp, stru /* * Find a free (set) bit in the inode bitmask. */ -#define XFS_IALLOC_FIND_FREE(fp) xfs_ialloc_find_free(fp) static inline int xfs_ialloc_find_free(xfs_inofree_t *fp) { return xfs_lowbit64(*fp); Index: xfs/fs/xfs/xfs_ialloc_btree.h =================================================================== --- xfs.orig/fs/xfs/xfs_ialloc_btree.h +++ xfs/fs/xfs/xfs_ialloc_btree.h @@ -37,7 +37,6 @@ typedef __uint64_t xfs_inofree_t; #define XFS_INODES_PER_CHUNK_LOG (XFS_NBBYLOG + 3) #define XFS_INOBT_ALL_FREE ((xfs_inofree_t)-1) -#define XFS_INOBT_MASKN(i,n) xfs_inobt_maskn(i,n) static inline xfs_inofree_t xfs_inobt_maskn(int i, int n) { return (((n) >= XFS_INODES_PER_CHUNK ? \ Index: xfs/fs/xfs/xfs_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode.c +++ xfs/fs/xfs/xfs_inode.c @@ -1662,10 +1662,10 @@ xfs_itruncate_finish( * in this file with garbage in them once recovery * runs. */ - XFS_BMAP_INIT(&free_list, &first_block); + xfs_bmap_init(&free_list, &first_block); error = xfs_bunmapi(ntp, ip, first_unmap_block, unmap_len, - XFS_BMAPI_AFLAG(fork) | + xfs_bmapi_aflag(fork) | (sync ? 0 : XFS_BMAPI_ASYNC), XFS_ITRUNC_MAX_EXTENTS, &first_block, &free_list, @@ -2784,7 +2784,7 @@ xfs_iextents_copy( for (i = 0; i < nrecs; i++) { xfs_bmbt_rec_host_t *ep = xfs_iext_get_ext(ifp, i); start_block = xfs_bmbt_get_startblock(ep); - if (ISNULLSTARTBLOCK(start_block)) { + if (isnullstartblock(start_block)) { /* * It's a delayed allocation extent, so skip it. */ Index: xfs/fs/xfs/xfs_inode_item.h =================================================================== --- xfs.orig/fs/xfs/xfs_inode_item.h +++ xfs/fs/xfs/xfs_inode_item.h @@ -147,22 +147,13 @@ typedef struct xfs_inode_log_item { xfs_inode_log_format_t ili_format; /* logged structure */ } xfs_inode_log_item_t; - -#define XFS_ILOG_FDATA(w) xfs_ilog_fdata(w) -static inline int xfs_ilog_fdata(int w) -{ - return (w == XFS_DATA_FORK ? XFS_ILOG_DDATA : XFS_ILOG_ADATA); -} - #endif /* __KERNEL__ */ -#define XFS_ILOG_FBROOT(w) xfs_ilog_fbroot(w) static inline int xfs_ilog_fbroot(int w) { return (w == XFS_DATA_FORK ? XFS_ILOG_DBROOT : XFS_ILOG_ABROOT); } -#define XFS_ILOG_FEXT(w) xfs_ilog_fext(w) static inline int xfs_ilog_fext(int w) { return (w == XFS_DATA_FORK ? XFS_ILOG_DEXT : XFS_ILOG_AEXT); Index: xfs/fs/xfs/xfs_iomap.c =================================================================== --- xfs.orig/fs/xfs/xfs_iomap.c +++ xfs/fs/xfs/xfs_iomap.c @@ -155,7 +155,7 @@ xfs_imap_to_bmap( iomapp->iomap_bn = IOMAP_DADDR_NULL; iomapp->iomap_flags |= IOMAP_DELAY; } else { - iomapp->iomap_bn = XFS_FSB_TO_DB(ip, start_block); + iomapp->iomap_bn = xfs_fsb_to_db(ip, start_block); if (ISUNWRITTEN(imap)) iomapp->iomap_flags |= IOMAP_UNWRITTEN; } @@ -261,7 +261,7 @@ xfs_iomap( xfs_iunlock(ip, lockmode); lockmode = 0; - if (nimaps && !ISNULLSTARTBLOCK(imap.br_startblock)) { + if (nimaps && !isnullstartblock(imap.br_startblock)) { xfs_iomap_map_trace(XFS_IOMAP_WRITE_MAP, ip, offset, count, iomapp, &imap, flags); break; @@ -498,7 +498,7 @@ xfs_iomap_write_direct( /* * Issue the xfs_bmapi() call to allocate the blocks */ - XFS_BMAP_INIT(&free_list, &firstfsb); + xfs_bmap_init(&free_list, &firstfsb); nimaps = 1; error = xfs_bmapi(tp, ip, offset_fsb, count_fsb, bmapi_flag, &firstfsb, 0, &imap, &nimaps, &free_list, NULL); @@ -765,7 +765,7 @@ xfs_iomap_write_allocate( xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); xfs_trans_ihold(tp, ip); - XFS_BMAP_INIT(&free_list, &first_block); + xfs_bmap_init(&free_list, &first_block); /* * it is possible that the extents have changed since @@ -925,7 +925,7 @@ xfs_iomap_write_unwritten( /* * Modify the unwritten extent state of the buffer. */ - XFS_BMAP_INIT(&free_list, &firstfsb); + xfs_bmap_init(&free_list, &firstfsb); nimaps = 1; error = xfs_bmapi(tp, ip, offset_fsb, count_fsb, XFS_BMAPI_WRITE|XFS_BMAPI_CONVERT, &firstfsb, Index: xfs/fs/xfs/xfs_itable.c =================================================================== --- xfs.orig/fs/xfs/xfs_itable.c +++ xfs/fs/xfs/xfs_itable.c @@ -442,7 +442,7 @@ xfs_bulkstat( (chunkidx = agino - gino + 1) < XFS_INODES_PER_CHUNK && /* there are some left allocated */ - XFS_INOBT_MASKN(chunkidx, + xfs_inobt_maskn(chunkidx, XFS_INODES_PER_CHUNK - chunkidx) & ~gfree) { /* * Grab the chunk record. Mark all the @@ -453,7 +453,7 @@ xfs_bulkstat( if (XFS_INOBT_MASK(i) & ~gfree) gcnt++; } - gfree |= XFS_INOBT_MASKN(0, chunkidx); + gfree |= xfs_inobt_maskn(0, chunkidx); irbp->ir_startino = gino; irbp->ir_freecount = gcnt; irbp->ir_free = gfree; @@ -524,7 +524,7 @@ xfs_bulkstat( chunkidx < XFS_INODES_PER_CHUNK; chunkidx += nicluster, agbno += nbcluster) { - if (XFS_INOBT_MASKN(chunkidx, + if (xfs_inobt_maskn(chunkidx, nicluster) & ~gfree) xfs_btree_reada_bufs(mp, agno, agbno, nbcluster); Index: xfs/fs/xfs/xfs_rename.c =================================================================== --- xfs.orig/fs/xfs/xfs_rename.c +++ xfs/fs/xfs/xfs_rename.c @@ -172,7 +172,7 @@ xfs_rename( xfs_sort_for_rename(src_dp, target_dp, src_ip, target_ip, inodes, &num_inodes); - XFS_BMAP_INIT(&free_list, &first_block); + xfs_bmap_init(&free_list, &first_block); tp = xfs_trans_alloc(mp, XFS_TRANS_RENAME); cancel_flags = XFS_TRANS_RELEASE_LOG_RES; spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len); Index: xfs/fs/xfs/xfs_rtalloc.c =================================================================== --- xfs.orig/fs/xfs/xfs_rtalloc.c +++ xfs/fs/xfs/xfs_rtalloc.c @@ -120,7 +120,7 @@ xfs_growfs_rt_alloc( if ((error = xfs_trans_iget(mp, tp, ino, 0, XFS_ILOCK_EXCL, &ip))) goto error_cancel; - XFS_BMAP_INIT(&flist, &firstblock); + xfs_bmap_init(&flist, &firstblock); /* * Allocate blocks to the bitmap file. */ Index: xfs/fs/xfs/xfs_rw.h =================================================================== --- xfs.orig/fs/xfs/xfs_rw.h +++ xfs/fs/xfs/xfs_rw.h @@ -28,7 +28,6 @@ struct xfs_mount; * file is a real time file or not, because the bmap code * does. */ -#define XFS_FSB_TO_DB(ip,fsb) xfs_fsb_to_db(ip,fsb) static inline xfs_daddr_t xfs_fsb_to_db(struct xfs_inode *ip, xfs_fsblock_t fsb) { Index: xfs/fs/xfs/xfs_vnodeops.c =================================================================== --- xfs.orig/fs/xfs/xfs_vnodeops.c +++ xfs/fs/xfs/xfs_vnodeops.c @@ -971,7 +971,7 @@ xfs_inactive_symlink_rmt( * Find the block(s) so we can inval and unmap them. */ done = 0; - XFS_BMAP_INIT(&free_list, &first_block); + xfs_bmap_init(&free_list, &first_block); nmaps = ARRAY_SIZE(mval); if ((error = xfs_bmapi(tp, ip, 0, XFS_B_TO_FSB(mp, size), XFS_BMAPI_METADATA, &first_block, 0, mval, &nmaps, @@ -1391,7 +1391,7 @@ xfs_inactive( /* * Free the inode. */ - XFS_BMAP_INIT(&free_list, &first_block); + xfs_bmap_init(&free_list, &first_block); error = xfs_ifree(tp, ip, &free_list); if (error) { /* @@ -1564,7 +1564,7 @@ xfs_create( xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); unlock_dp_on_error = B_TRUE; - XFS_BMAP_INIT(&free_list, &first_block); + xfs_bmap_init(&free_list, &first_block); ASSERT(ip == NULL); @@ -1984,7 +1984,7 @@ xfs_remove( } } - XFS_BMAP_INIT(&free_list, &first_block); + xfs_bmap_init(&free_list, &first_block); error = xfs_dir_removename(tp, dp, name, ip->i_ino, &first_block, &free_list, resblks); if (error) { @@ -2171,7 +2171,7 @@ xfs_link( if (error) goto error_return; - XFS_BMAP_INIT(&free_list, &first_block); + xfs_bmap_init(&free_list, &first_block); error = xfs_dir_createname(tp, tdp, target_name, sip->i_ino, &first_block, &free_list, resblks); @@ -2344,7 +2344,7 @@ xfs_mkdir( xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); unlock_dp_on_error = B_FALSE; - XFS_BMAP_INIT(&free_list, &first_block); + xfs_bmap_init(&free_list, &first_block); error = xfs_dir_createname(tp, dp, dir_name, cdp->i_ino, &first_block, &free_list, resblks ? @@ -2559,7 +2559,7 @@ xfs_symlink( * Initialize the bmap freelist prior to calling either * bmapi or the directory create code. */ - XFS_BMAP_INIT(&free_list, &first_block); + xfs_bmap_init(&free_list, &first_block); /* * Allocate an inode for the symlink. @@ -3100,7 +3100,7 @@ retry: /* * Issue the xfs_bmapi() call to allocate the blocks */ - XFS_BMAP_INIT(&free_list, &firstfsb); + xfs_bmap_init(&free_list, &firstfsb); error = xfs_bmapi(tp, ip, startoffset_fsb, allocatesize_fsb, bmapi_flag, &firstfsb, 0, imapp, &nimaps, @@ -3218,7 +3218,7 @@ xfs_zero_remaining_bytes( XFS_BUF_UNDONE(bp); XFS_BUF_UNWRITE(bp); XFS_BUF_READ(bp); - XFS_BUF_SET_ADDR(bp, XFS_FSB_TO_DB(ip, imap.br_startblock)); + XFS_BUF_SET_ADDR(bp, xfs_fsb_to_db(ip, imap.br_startblock)); xfsbdstrat(mp, bp); error = xfs_iowait(bp); if (error) { @@ -3423,7 +3423,7 @@ xfs_free_file_space( /* * issue the bunmapi() call to free the blocks */ - XFS_BMAP_INIT(&free_list, &firstfsb); + xfs_bmap_init(&free_list, &firstfsb); error = xfs_bunmapi(tp, ip, startoffset_fsb, endoffset_fsb - startoffset_fsb, 0, 2, &firstfsb, &free_list, NULL, &done); Index: xfs/fs/xfs/xfs_ag.h =================================================================== --- xfs.orig/fs/xfs/xfs_ag.h +++ xfs/fs/xfs/xfs_ag.h @@ -233,8 +233,8 @@ typedef struct xfs_perag #define XFS_AG_CHECK_DADDR(mp,d,len) \ ((len) == 1 ? \ ASSERT((d) == XFS_SB_DADDR || \ - XFS_DADDR_TO_AGBNO(mp, d) != XFS_SB_DADDR) : \ - ASSERT(XFS_DADDR_TO_AGNO(mp, d) == \ - XFS_DADDR_TO_AGNO(mp, (d) + (len) - 1))) + xfs_daddr_to_agbno(mp, d) != XFS_SB_DADDR) : \ + ASSERT(xfs_daddr_to_agno(mp, d) == \ + xfs_daddr_to_agno(mp, (d) + (len) - 1))) #endif /* __XFS_AG_H__ */ Index: xfs/fs/xfs/xfs_alloc_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_alloc_btree.c +++ xfs/fs/xfs/xfs_alloc_btree.c @@ -1368,7 +1368,7 @@ xfs_alloc_newroot( /* * Our block is left, pick up the right block. */ - lbno = XFS_DADDR_TO_AGBNO(mp, XFS_BUF_ADDR(lbp)); + lbno = xfs_daddr_to_agbno(mp, XFS_BUF_ADDR(lbp)); rbno = be32_to_cpu(left->bb_rightsib); if ((error = xfs_btree_read_bufs(mp, cur->bc_tp, cur->bc_private.a.agno, rbno, 0, &rbp, @@ -1385,7 +1385,7 @@ xfs_alloc_newroot( */ rbp = lbp; right = left; - rbno = XFS_DADDR_TO_AGBNO(mp, XFS_BUF_ADDR(rbp)); + rbno = xfs_daddr_to_agbno(mp, XFS_BUF_ADDR(rbp)); lbno = be32_to_cpu(right->bb_leftsib); if ((error = xfs_btree_read_bufs(mp, cur->bc_tp, cur->bc_private.a.agno, lbno, 0, &lbp, @@ -1688,7 +1688,7 @@ xfs_alloc_split( * Find the left block number by looking in the buffer. * Adjust numrecs, sibling pointers. */ - lbno = XFS_DADDR_TO_AGBNO(cur->bc_mp, XFS_BUF_ADDR(lbp)); + lbno = xfs_daddr_to_agbno(cur->bc_mp, XFS_BUF_ADDR(lbp)); be16_add_cpu(&left->bb_numrecs, -(be16_to_cpu(right->bb_numrecs))); right->bb_rightsib = left->bb_rightsib; left->bb_rightsib = cpu_to_be32(rbno); Index: xfs/fs/xfs/xfs_ialloc_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_ialloc_btree.c +++ xfs/fs/xfs/xfs_ialloc_btree.c @@ -1252,7 +1252,7 @@ xfs_inobt_newroot( * Our block is left, pick up the right block. */ lbp = bp; - lbno = XFS_DADDR_TO_AGBNO(args.mp, XFS_BUF_ADDR(lbp)); + lbno = xfs_daddr_to_agbno(args.mp, XFS_BUF_ADDR(lbp)); left = block; rbno = be32_to_cpu(left->bb_rightsib); if ((error = xfs_btree_read_bufs(args.mp, args.tp, args.agno, @@ -1269,7 +1269,7 @@ xfs_inobt_newroot( * Our block is right, pick up the left block. */ rbp = bp; - rbno = XFS_DADDR_TO_AGBNO(args.mp, XFS_BUF_ADDR(rbp)); + rbno = xfs_daddr_to_agbno(args.mp, XFS_BUF_ADDR(rbp)); right = block; lbno = be32_to_cpu(right->bb_leftsib); if ((error = xfs_btree_read_bufs(args.mp, args.tp, args.agno, @@ -1487,7 +1487,7 @@ xfs_inobt_split( lbp = cur->bc_bufs[level]; args.tp = cur->bc_tp; args.mp = cur->bc_mp; - lbno = XFS_DADDR_TO_AGBNO(args.mp, XFS_BUF_ADDR(lbp)); + lbno = xfs_daddr_to_agbno(args.mp, XFS_BUF_ADDR(lbp)); /* * Allocate the new block. * If we can't do it, we're toast. Give up. Index: xfs/fs/xfs/xfs_mount.h =================================================================== --- xfs.orig/fs/xfs/xfs_mount.h +++ xfs/fs/xfs/xfs_mount.h @@ -47,9 +47,9 @@ typedef struct xfs_trans_reservations { /* * Moved here from xfs_ag.h to avoid reordering header files */ -#define XFS_DADDR_TO_AGNO(mp,d) \ +#define xfs_daddr_to_agno(mp,d) \ ((xfs_agnumber_t)(XFS_BB_TO_FSBT(mp, d) / (mp)->m_sb.sb_agblocks)) -#define XFS_DADDR_TO_AGBNO(mp,d) \ +#define xfs_daddr_to_agbno(mp,d) \ ((xfs_agblock_t)(XFS_BB_TO_FSBT(mp, d) % (mp)->m_sb.sb_agblocks)) #else struct cred; @@ -444,7 +444,6 @@ void xfs_do_force_shutdown(struct xfs_mo */ #define XFS_MFSI_QUIET 0x40 /* Be silent if mount errors found */ -#define XFS_DADDR_TO_AGNO(mp,d) xfs_daddr_to_agno(mp,d) static inline xfs_agnumber_t xfs_daddr_to_agno(struct xfs_mount *mp, xfs_daddr_t d) { @@ -453,7 +452,6 @@ xfs_daddr_to_agno(struct xfs_mount *mp, return (xfs_agnumber_t) ld; } -#define XFS_DADDR_TO_AGBNO(mp,d) xfs_daddr_to_agbno(mp,d) static inline xfs_agblock_t xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d) { Index: xfs/fs/xfs/xfs_sb.h =================================================================== --- xfs.orig/fs/xfs/xfs_sb.h +++ xfs/fs/xfs/xfs_sb.h @@ -498,7 +498,7 @@ static inline void xfs_sb_version_remove #define XFS_HDR_BLOCK(mp,d) ((xfs_agblock_t)XFS_BB_TO_FSBT(mp,d)) #define XFS_DADDR_TO_FSB(mp,d) XFS_AGB_TO_FSB(mp, \ - XFS_DADDR_TO_AGNO(mp,d), XFS_DADDR_TO_AGBNO(mp,d)) + xfs_daddr_to_agno(mp,d), xfs_daddr_to_agbno(mp,d)) #define XFS_FSB_TO_DADDR(mp,fsbno) XFS_AGB_TO_DADDR(mp, \ XFS_FSB_TO_AGNO(mp,fsbno), XFS_FSB_TO_AGBNO(mp,fsbno)) -- From sandeen@sandeen.net Thu Jan 1 16:41:28 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01MfSMS032011 for ; Thu, 1 Jan 2009 16:41:28 -0600 X-ASG-Debug-ID: 1230849687-7a94031a0000-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 A65A658686 for ; Thu, 1 Jan 2009 14:41:27 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id RDs85GiYHSZ3uSbf for ; Thu, 01 Jan 2009 14:41:27 -0800 (PST) Received: by mail.sandeen.net (Postfix, from userid 500) id C7D79AC6273; Thu, 1 Jan 2009 16:40:56 -0600 (CST) Message-Id: <20090101224009.616367334@sandeen.net> User-Agent: quilt/0.46-1 Date: Thu, 01 Jan 2009 16:40:09 -0600 From: Eric Sandeen To: xfs@oss.sgi.com X-ASG-Orig-Subj: [patch 0/4] Remove unused typedefs & last of the macro-to-function indirections Subject: [patch 0/4] Remove unused typedefs & last of the macro-to-function indirections X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1230849687 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14183 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- At least I think it's the last of them. :) -- From sandeen@sandeen.net Thu Jan 1 16:41:30 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-3.7 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_61, J_CHICKENPOX_65,LOCAL_GNU_PATCH autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01MfUTl032023 for ; Thu, 1 Jan 2009 16:41:30 -0600 X-ASG-Debug-ID: 1230849688-083b02320000-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 94EFE58688 for ; Thu, 1 Jan 2009 14:41:28 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id zLONI8CiHB0F0zLA for ; Thu, 01 Jan 2009 14:41:28 -0800 (PST) Received: by mail.sandeen.net (Postfix, from userid 500) id BC0AAA81D5D; Thu, 1 Jan 2009 16:40:57 -0600 (CST) Message-Id: <20090101224057.464622607@sandeen.net> References: <20090101224009.616367334@sandeen.net> User-Agent: quilt/0.46-1 Date: Thu, 01 Jan 2009 16:40:12 -0600 From: Eric Sandeen To: xfs@oss.sgi.com X-ASG-Orig-Subj: [patch 3/4] Remove macro-to-function indirections in the mask code Subject: [patch 3/4] Remove macro-to-function indirections in the mask code Content-Disposition: inline; filename=XFS_MASK_SHOUTING X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1230849688 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14183 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Eric Sandeen --- Index: xfs/fs/xfs/xfs_bit.h =================================================================== --- xfs.orig/fs/xfs/xfs_bit.h +++ xfs/fs/xfs/xfs_bit.h @@ -23,24 +23,16 @@ */ /* - * masks with n high/low bits set, 32-bit values & 64-bit values + * masks with n high/low bits set, 64-bit values */ -#define XFS_MASK32HI(n) xfs_mask32hi(n) -static inline __uint32_t xfs_mask32hi(int n) -{ - return (__uint32_t)-1 << (32 - (n)); -} -#define XFS_MASK64HI(n) xfs_mask64hi(n) static inline __uint64_t xfs_mask64hi(int n) { return (__uint64_t)-1 << (64 - (n)); } -#define XFS_MASK32LO(n) xfs_mask32lo(n) static inline __uint32_t xfs_mask32lo(int n) { return ((__uint32_t)1 << (n)) - 1; } -#define XFS_MASK64LO(n) xfs_mask64lo(n) static inline __uint64_t xfs_mask64lo(int n) { return ((__uint64_t)1 << (n)) - 1; Index: xfs/fs/xfs/xfs_bmap_btree.c =================================================================== --- xfs.orig/fs/xfs/xfs_bmap_btree.c +++ xfs/fs/xfs/xfs_bmap_btree.c @@ -1827,16 +1827,16 @@ __xfs_bmbt_get_all( ext_flag = (int)(l0 >> (64 - BMBT_EXNTFLAG_BITLEN)); s->br_startoff = ((xfs_fileoff_t)l0 & - XFS_MASK64LO(64 - BMBT_EXNTFLAG_BITLEN)) >> 9; + xfs_mask64lo(64 - BMBT_EXNTFLAG_BITLEN)) >> 9; #if XFS_BIG_BLKNOS - s->br_startblock = (((xfs_fsblock_t)l0 & XFS_MASK64LO(9)) << 43) | + s->br_startblock = (((xfs_fsblock_t)l0 & xfs_mask64lo(9)) << 43) | (((xfs_fsblock_t)l1) >> 21); #else #ifdef DEBUG { xfs_dfsbno_t b; - b = (((xfs_dfsbno_t)l0 & XFS_MASK64LO(9)) << 43) | + b = (((xfs_dfsbno_t)l0 & xfs_mask64lo(9)) << 43) | (((xfs_dfsbno_t)l1) >> 21); ASSERT((b >> 32) == 0 || ISNULLDSTARTBLOCK(b)); s->br_startblock = (xfs_fsblock_t)b; @@ -1845,7 +1845,7 @@ __xfs_bmbt_get_all( s->br_startblock = (xfs_fsblock_t)(((xfs_dfsbno_t)l1) >> 21); #endif /* DEBUG */ #endif /* XFS_BIG_BLKNOS */ - s->br_blockcount = (xfs_filblks_t)(l1 & XFS_MASK64LO(21)); + s->br_blockcount = (xfs_filblks_t)(l1 & xfs_mask64lo(21)); /* This is xfs_extent_state() in-line */ if (ext_flag) { ASSERT(s->br_blockcount != 0); /* saved for DMIG */ @@ -1895,7 +1895,7 @@ xfs_filblks_t xfs_bmbt_get_blockcount( xfs_bmbt_rec_host_t *r) { - return (xfs_filblks_t)(r->l1 & XFS_MASK64LO(21)); + return (xfs_filblks_t)(r->l1 & xfs_mask64lo(21)); } /* @@ -1906,13 +1906,13 @@ xfs_bmbt_get_startblock( xfs_bmbt_rec_host_t *r) { #if XFS_BIG_BLKNOS - return (((xfs_fsblock_t)r->l0 & XFS_MASK64LO(9)) << 43) | + return (((xfs_fsblock_t)r->l0 & xfs_mask64lo(9)) << 43) | (((xfs_fsblock_t)r->l1) >> 21); #else #ifdef DEBUG xfs_dfsbno_t b; - b = (((xfs_dfsbno_t)r->l0 & XFS_MASK64LO(9)) << 43) | + b = (((xfs_dfsbno_t)r->l0 & xfs_mask64lo(9)) << 43) | (((xfs_dfsbno_t)r->l1) >> 21); ASSERT((b >> 32) == 0 || ISNULLDSTARTBLOCK(b)); return (xfs_fsblock_t)b; @@ -1930,7 +1930,7 @@ xfs_bmbt_get_startoff( xfs_bmbt_rec_host_t *r) { return ((xfs_fileoff_t)r->l0 & - XFS_MASK64LO(64 - BMBT_EXNTFLAG_BITLEN)) >> 9; + xfs_mask64lo(64 - BMBT_EXNTFLAG_BITLEN)) >> 9; } xfs_exntst_t @@ -1960,7 +1960,7 @@ xfs_filblks_t xfs_bmbt_disk_get_blockcount( xfs_bmbt_rec_t *r) { - return (xfs_filblks_t)(be64_to_cpu(r->l1) & XFS_MASK64LO(21)); + return (xfs_filblks_t)(be64_to_cpu(r->l1) & xfs_mask64lo(21)); } /* @@ -1971,7 +1971,7 @@ xfs_bmbt_disk_get_startoff( xfs_bmbt_rec_t *r) { return ((xfs_fileoff_t)be64_to_cpu(r->l0) & - XFS_MASK64LO(64 - BMBT_EXNTFLAG_BITLEN)) >> 9; + xfs_mask64lo(64 - BMBT_EXNTFLAG_BITLEN)) >> 9; } /* @@ -2331,33 +2331,33 @@ xfs_bmbt_set_allf( int extent_flag = (state == XFS_EXT_NORM) ? 0 : 1; ASSERT(state == XFS_EXT_NORM || state == XFS_EXT_UNWRITTEN); - ASSERT((startoff & XFS_MASK64HI(64-BMBT_STARTOFF_BITLEN)) == 0); - ASSERT((blockcount & XFS_MASK64HI(64-BMBT_BLOCKCOUNT_BITLEN)) == 0); + ASSERT((startoff & xfs_mask64hi(64-BMBT_STARTOFF_BITLEN)) == 0); + ASSERT((blockcount & xfs_mask64hi(64-BMBT_BLOCKCOUNT_BITLEN)) == 0); #if XFS_BIG_BLKNOS - ASSERT((startblock & XFS_MASK64HI(64-BMBT_STARTBLOCK_BITLEN)) == 0); + ASSERT((startblock & xfs_mask64hi(64-BMBT_STARTBLOCK_BITLEN)) == 0); r->l0 = ((xfs_bmbt_rec_base_t)extent_flag << 63) | ((xfs_bmbt_rec_base_t)startoff << 9) | ((xfs_bmbt_rec_base_t)startblock >> 43); r->l1 = ((xfs_bmbt_rec_base_t)startblock << 21) | ((xfs_bmbt_rec_base_t)blockcount & - (xfs_bmbt_rec_base_t)XFS_MASK64LO(21)); + (xfs_bmbt_rec_base_t)xfs_mask64lo(21)); #else /* !XFS_BIG_BLKNOS */ if (ISNULLSTARTBLOCK(startblock)) { r->l0 = ((xfs_bmbt_rec_base_t)extent_flag << 63) | ((xfs_bmbt_rec_base_t)startoff << 9) | - (xfs_bmbt_rec_base_t)XFS_MASK64LO(9); - r->l1 = XFS_MASK64HI(11) | + (xfs_bmbt_rec_base_t)xfs_mask64lo(9); + r->l1 = xfs_mask64hi(11) | ((xfs_bmbt_rec_base_t)startblock << 21) | ((xfs_bmbt_rec_base_t)blockcount & - (xfs_bmbt_rec_base_t)XFS_MASK64LO(21)); + (xfs_bmbt_rec_base_t)xfs_mask64lo(21)); } else { r->l0 = ((xfs_bmbt_rec_base_t)extent_flag << 63) | ((xfs_bmbt_rec_base_t)startoff << 9); r->l1 = ((xfs_bmbt_rec_base_t)startblock << 21) | ((xfs_bmbt_rec_base_t)blockcount & - (xfs_bmbt_rec_base_t)XFS_MASK64LO(21)); + (xfs_bmbt_rec_base_t)xfs_mask64lo(21)); } #endif /* XFS_BIG_BLKNOS */ } @@ -2389,11 +2389,11 @@ xfs_bmbt_disk_set_allf( int extent_flag = (state == XFS_EXT_NORM) ? 0 : 1; ASSERT(state == XFS_EXT_NORM || state == XFS_EXT_UNWRITTEN); - ASSERT((startoff & XFS_MASK64HI(64-BMBT_STARTOFF_BITLEN)) == 0); - ASSERT((blockcount & XFS_MASK64HI(64-BMBT_BLOCKCOUNT_BITLEN)) == 0); + ASSERT((startoff & xfs_mask64hi(64-BMBT_STARTOFF_BITLEN)) == 0); + ASSERT((blockcount & xfs_mask64hi(64-BMBT_BLOCKCOUNT_BITLEN)) == 0); #if XFS_BIG_BLKNOS - ASSERT((startblock & XFS_MASK64HI(64-BMBT_STARTBLOCK_BITLEN)) == 0); + ASSERT((startblock & xfs_mask64hi(64-BMBT_STARTBLOCK_BITLEN)) == 0); r->l0 = cpu_to_be64( ((xfs_bmbt_rec_base_t)extent_flag << 63) | @@ -2402,17 +2402,17 @@ xfs_bmbt_disk_set_allf( r->l1 = cpu_to_be64( ((xfs_bmbt_rec_base_t)startblock << 21) | ((xfs_bmbt_rec_base_t)blockcount & - (xfs_bmbt_rec_base_t)XFS_MASK64LO(21))); + (xfs_bmbt_rec_base_t)xfs_mask64lo(21))); #else /* !XFS_BIG_BLKNOS */ if (ISNULLSTARTBLOCK(startblock)) { r->l0 = cpu_to_be64( ((xfs_bmbt_rec_base_t)extent_flag << 63) | ((xfs_bmbt_rec_base_t)startoff << 9) | - (xfs_bmbt_rec_base_t)XFS_MASK64LO(9)); - r->l1 = cpu_to_be64(XFS_MASK64HI(11) | + (xfs_bmbt_rec_base_t)xfs_mask64lo(9)); + r->l1 = cpu_to_be64(xfs_mask64hi(11) | ((xfs_bmbt_rec_base_t)startblock << 21) | ((xfs_bmbt_rec_base_t)blockcount & - (xfs_bmbt_rec_base_t)XFS_MASK64LO(21))); + (xfs_bmbt_rec_base_t)xfs_mask64lo(21))); } else { r->l0 = cpu_to_be64( ((xfs_bmbt_rec_base_t)extent_flag << 63) | @@ -2420,7 +2420,7 @@ xfs_bmbt_disk_set_allf( r->l1 = cpu_to_be64( ((xfs_bmbt_rec_base_t)startblock << 21) | ((xfs_bmbt_rec_base_t)blockcount & - (xfs_bmbt_rec_base_t)XFS_MASK64LO(21))); + (xfs_bmbt_rec_base_t)xfs_mask64lo(21))); } #endif /* XFS_BIG_BLKNOS */ } @@ -2445,9 +2445,9 @@ xfs_bmbt_set_blockcount( xfs_bmbt_rec_host_t *r, xfs_filblks_t v) { - ASSERT((v & XFS_MASK64HI(43)) == 0); - r->l1 = (r->l1 & (xfs_bmbt_rec_base_t)XFS_MASK64HI(43)) | - (xfs_bmbt_rec_base_t)(v & XFS_MASK64LO(21)); + ASSERT((v & xfs_mask64hi(43)) == 0); + r->l1 = (r->l1 & (xfs_bmbt_rec_base_t)xfs_mask64hi(43)) | + (xfs_bmbt_rec_base_t)(v & xfs_mask64lo(21)); } /* @@ -2459,21 +2459,21 @@ xfs_bmbt_set_startblock( xfs_fsblock_t v) { #if XFS_BIG_BLKNOS - ASSERT((v & XFS_MASK64HI(12)) == 0); - r->l0 = (r->l0 & (xfs_bmbt_rec_base_t)XFS_MASK64HI(55)) | + ASSERT((v & xfs_mask64hi(12)) == 0); + r->l0 = (r->l0 & (xfs_bmbt_rec_base_t)xfs_mask64hi(55)) | (xfs_bmbt_rec_base_t)(v >> 43); - r->l1 = (r->l1 & (xfs_bmbt_rec_base_t)XFS_MASK64LO(21)) | + r->l1 = (r->l1 & (xfs_bmbt_rec_base_t)xfs_mask64lo(21)) | (xfs_bmbt_rec_base_t)(v << 21); #else /* !XFS_BIG_BLKNOS */ if (ISNULLSTARTBLOCK(v)) { - r->l0 |= (xfs_bmbt_rec_base_t)XFS_MASK64LO(9); - r->l1 = (xfs_bmbt_rec_base_t)XFS_MASK64HI(11) | + r->l0 |= (xfs_bmbt_rec_base_t)xfs_mask64lo(9); + r->l1 = (xfs_bmbt_rec_base_t)xfs_mask64hi(11) | ((xfs_bmbt_rec_base_t)v << 21) | - (r->l1 & (xfs_bmbt_rec_base_t)XFS_MASK64LO(21)); + (r->l1 & (xfs_bmbt_rec_base_t)xfs_mask64lo(21)); } else { - r->l0 &= ~(xfs_bmbt_rec_base_t)XFS_MASK64LO(9); + r->l0 &= ~(xfs_bmbt_rec_base_t)xfs_mask64lo(9); r->l1 = ((xfs_bmbt_rec_base_t)v << 21) | - (r->l1 & (xfs_bmbt_rec_base_t)XFS_MASK64LO(21)); + (r->l1 & (xfs_bmbt_rec_base_t)xfs_mask64lo(21)); } #endif /* XFS_BIG_BLKNOS */ } @@ -2486,10 +2486,10 @@ xfs_bmbt_set_startoff( xfs_bmbt_rec_host_t *r, xfs_fileoff_t v) { - ASSERT((v & XFS_MASK64HI(9)) == 0); - r->l0 = (r->l0 & (xfs_bmbt_rec_base_t) XFS_MASK64HI(1)) | + ASSERT((v & xfs_mask64hi(9)) == 0); + r->l0 = (r->l0 & (xfs_bmbt_rec_base_t) xfs_mask64hi(1)) | ((xfs_bmbt_rec_base_t)v << 9) | - (r->l0 & (xfs_bmbt_rec_base_t)XFS_MASK64LO(9)); + (r->l0 & (xfs_bmbt_rec_base_t)xfs_mask64lo(9)); } /* @@ -2502,9 +2502,9 @@ xfs_bmbt_set_state( { ASSERT(v == XFS_EXT_NORM || v == XFS_EXT_UNWRITTEN); if (v == XFS_EXT_NORM) - r->l0 &= XFS_MASK64LO(64 - BMBT_EXNTFLAG_BITLEN); + r->l0 &= xfs_mask64lo(64 - BMBT_EXNTFLAG_BITLEN); else - r->l0 |= XFS_MASK64HI(BMBT_EXNTFLAG_BITLEN); + r->l0 |= xfs_mask64hi(BMBT_EXNTFLAG_BITLEN); } /* Index: xfs/fs/xfs/xfs_ag.h =================================================================== --- xfs.orig/fs/xfs/xfs_ag.h +++ xfs/fs/xfs/xfs_ag.h @@ -220,7 +220,7 @@ typedef struct xfs_perag #define XFS_FSB_TO_AGNO(mp,fsbno) \ ((xfs_agnumber_t)((fsbno) >> (mp)->m_sb.sb_agblklog)) #define XFS_FSB_TO_AGBNO(mp,fsbno) \ - ((xfs_agblock_t)((fsbno) & XFS_MASK32LO((mp)->m_sb.sb_agblklog))) + ((xfs_agblock_t)((fsbno) & xfs_mask32lo((mp)->m_sb.sb_agblklog))) #define XFS_AGB_TO_DADDR(mp,agno,agbno) \ ((xfs_daddr_t)XFS_FSB_TO_BB(mp, \ (xfs_fsblock_t)(agno) * (mp)->m_sb.sb_agblocks + (agbno))) -- From sandeen@sandeen.net Thu Jan 1 16:45:33 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01MjXsq000361 for ; Thu, 1 Jan 2009 16:45:33 -0600 X-ASG-Debug-ID: 1230849931-1358021d0000-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 3BBC6586BF for ; Thu, 1 Jan 2009 14:45:31 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id 2BZuDeHFHnOwC5AW for ; Thu, 01 Jan 2009 14:45:31 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 6C48AAC6273 for ; Thu, 1 Jan 2009 16:45:32 -0600 (CST) Message-ID: <495D478B.9080702@sandeen.net> Date: Thu, 01 Jan 2009 16:45:31 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.19 (Macintosh/20081209) MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: [PATCH] remove flags param from xfs_free_eofblocks Subject: [PATCH] remove flags param from xfs_free_eofblocks Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1230849932 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.82 X-Barracuda-Spam-Status: No, SCORE=-1.82 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_MJ615 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14183 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.20 BSF_SC0_MJ615 Custom Rule MJ615 Remove unused XFS_FREE_EOF_NOLOCK and make XFS_FREE_EOF_LOCK default. XFS_FREE_EOF_NOLOCK is never used, so remove it, make XFS_FREE_EOF_LOCK the only behavior, and remove the flags parameters. Signed-off-by: Eric Sandeen --- Index: xfs/fs/xfs/xfs_rw.h =================================================================== --- xfs.orig/fs/xfs/xfs_rw.h +++ xfs/fs/xfs/xfs_rw.h @@ -37,13 +37,6 @@ xfs_fsb_to_db(struct xfs_inode *ip, xfs_ } /* - * Flags for xfs_free_eofblocks - */ -#define XFS_FREE_EOF_LOCK (1<<0) -#define XFS_FREE_EOF_NOLOCK (1<<1) - - -/* * helper function to extract extent size hint from inode */ STATIC_INLINE xfs_extlen_t @@ -81,7 +74,6 @@ extern void xfs_ioerror_alert(char *func /* * Prototypes for functions in xfs_vnodeops.c. */ -extern int xfs_free_eofblocks(struct xfs_mount *mp, struct xfs_inode *ip, - int flags); +extern int xfs_free_eofblocks(struct xfs_mount *mp, struct xfs_inode *ip); #endif /* __XFS_RW_H__ */ Index: xfs/fs/xfs/xfs_vnodeops.c =================================================================== --- xfs.orig/fs/xfs/xfs_vnodeops.c +++ xfs/fs/xfs/xfs_vnodeops.c @@ -814,8 +814,7 @@ xfs_fsync( int xfs_free_eofblocks( xfs_mount_t *mp, - xfs_inode_t *ip, - int flags) + xfs_inode_t *ip) { xfs_trans_t *tp; int error; @@ -824,7 +823,6 @@ xfs_free_eofblocks( xfs_filblks_t map_len; int nimaps; xfs_bmbt_irec_t imap; - int use_iolock = (flags & XFS_FREE_EOF_LOCK); /* * Figure out if there are any blocks beyond the end @@ -865,14 +863,12 @@ xfs_free_eofblocks( * cache and we can't * do that within a transaction. */ - if (use_iolock) - xfs_ilock(ip, XFS_IOLOCK_EXCL); + xfs_ilock(ip, XFS_IOLOCK_EXCL); error = xfs_itruncate_start(ip, XFS_ITRUNC_DEFINITE, ip->i_size); if (error) { xfs_trans_cancel(tp, 0); - if (use_iolock) - xfs_iunlock(ip, XFS_IOLOCK_EXCL); + xfs_iunlock(ip, XFS_IOLOCK_EXCL); return error; } @@ -909,8 +905,7 @@ xfs_free_eofblocks( error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); } - xfs_iunlock(ip, (use_iolock ? (XFS_IOLOCK_EXCL|XFS_ILOCK_EXCL) - : XFS_ILOCK_EXCL)); + xfs_iunlock(ip, XFS_IOLOCK_EXCL|XFS_ILOCK_EXCL); } return error; } @@ -1204,7 +1199,7 @@ xfs_release( (ip->i_df.if_flags & XFS_IFEXTENTS)) && (!(ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)))) { - error = xfs_free_eofblocks(mp, ip, XFS_FREE_EOF_LOCK); + error = xfs_free_eofblocks(mp, ip); if (error) return error; } @@ -1275,7 +1270,7 @@ xfs_inactive( (!(ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)) || (ip->i_delayed_blks != 0)))) { - error = xfs_free_eofblocks(mp, ip, XFS_FREE_EOF_LOCK); + error = xfs_free_eofblocks(mp, ip); if (error) return VN_INACTIVE_CACHE; } From SRS0+5d7d118362e34cbfec1b+1957+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 1 16:47:49 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01Mln15000514 for ; Thu, 1 Jan 2009 16:47:49 -0600 X-ASG-Debug-ID: 1230850068-60e700110000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3A4091BF869E for ; Thu, 1 Jan 2009 14:47:48 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 8VavSpLQPEtAYW3y for ; Thu, 01 Jan 2009 14:47:48 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LIWKR-00024Y-SS; Thu, 01 Jan 2009 22:47:47 +0000 Date: Thu, 1 Jan 2009 17:47:47 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [patch 2/4] Remove macro-to-function indirections in attr code Subject: Re: [patch 2/4] Remove macro-to-function indirections in attr code Message-ID: <20090101224747.GB7510@infradead.org> References: <20090101224009.616367334@sandeen.net> <20090101224057.147361063@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090101224057.147361063@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-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: 1230850068 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com Nice, thanks. From SRS0+5d7d118362e34cbfec1b+1957+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 1 16:48:03 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01Mm3wY000552 for ; Thu, 1 Jan 2009 16:48:03 -0600 X-ASG-Debug-ID: 1230850082-135802330000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DF87E587F7 for ; Thu, 1 Jan 2009 14:48:02 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 0ZNgPn5fAljGR8Rc for ; Thu, 01 Jan 2009 14:48:02 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LIWKB-000231-Pg; Thu, 01 Jan 2009 22:47:31 +0000 Date: Thu, 1 Jan 2009 17:47:31 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [patch 1/4] Remove several unused typedefs. Subject: Re: [patch 1/4] Remove several unused typedefs. Message-ID: <20090101224731.GA7510@infradead.org> References: <20090101224009.616367334@sandeen.net> <20090101224056.845580476@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090101224056.845580476@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-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: 1230850082 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com Looks good. From SRS0+5d7d118362e34cbfec1b+1957+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 1 16:48:05 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01Mm49v000559 for ; Thu, 1 Jan 2009 16:48:05 -0600 X-ASG-Debug-ID: 1230850083-4202026e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 17D9B1BF86DE for ; Thu, 1 Jan 2009 14:48:03 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id sEpZv8SMcoZMiy08 for ; Thu, 01 Jan 2009 14:48:03 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LIWKh-00028d-P6; Thu, 01 Jan 2009 22:48:03 +0000 Date: Thu, 1 Jan 2009 17:48:03 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [patch 3/4] Remove macro-to-function indirections in the mask code Subject: Re: [patch 3/4] Remove macro-to-function indirections in the mask code Message-ID: <20090101224803.GC7510@infradead.org> References: <20090101224009.616367334@sandeen.net> <20090101224057.464622607@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090101224057.464622607@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-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: 1230850084 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com Looks good. From SRS0+5d7d118362e34cbfec1b+1957+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 1 16:57:00 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01Muxrt001557 for ; Thu, 1 Jan 2009 16:57:00 -0600 X-ASG-Debug-ID: 1230850618-083b028a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 136545874B for ; Thu, 1 Jan 2009 14:56:58 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id WGOxJuX0BRzzNped for ; Thu, 01 Jan 2009 14:56:58 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LIWSq-00042I-5V; Thu, 01 Jan 2009 22:56:28 +0000 Date: Thu, 1 Jan 2009 17:56:28 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [patch 4/4] Remove the rest of the macro-to-function indirections. Subject: Re: [patch 4/4] Remove the rest of the macro-to-function indirections. Message-ID: <20090101225628.GD7510@infradead.org> References: <20090101224009.616367334@sandeen.net> <20090101224057.782251520@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090101224057.782251520@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-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: 1230850619 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com Looks good. From SRS0+5d7d118362e34cbfec1b+1957+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 1 16:57:18 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01MvIUd001619 for ; Thu, 1 Jan 2009 16:57:18 -0600 X-ASG-Debug-ID: 1230850637-425701150000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C99B758778 for ; Thu, 1 Jan 2009 14:57:17 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id MLRbiziELxM1GO6T for ; Thu, 01 Jan 2009 14:57:17 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LIWTd-0003Ya-FQ; Thu, 01 Jan 2009 22:57:17 +0000 Date: Thu, 1 Jan 2009 17:57:17 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss X-ASG-Orig-Subj: Re: [PATCH] remove flags param from xfs_free_eofblocks Subject: Re: [PATCH] remove flags param from xfs_free_eofblocks Message-ID: <20090101225717.GE7510@infradead.org> References: <495D478B.9080702@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <495D478B.9080702@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-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: 1230850637 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com On Thu, Jan 01, 2009 at 04:45:31PM -0600, Eric Sandeen wrote: > Remove unused XFS_FREE_EOF_NOLOCK and make XFS_FREE_EOF_LOCK default. > > XFS_FREE_EOF_NOLOCK is never used, so remove it, make > XFS_FREE_EOF_LOCK the only behavior, and remove the > flags parameters. Looks good to me. From SRS0+5d7d118362e34cbfec1b+1957+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 1 17:03:56 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01N3tUJ002121 for ; Thu, 1 Jan 2009 17:03:56 -0600 X-ASG-Debug-ID: 1230851034-057f03140000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 12A3F58742 for ; Thu, 1 Jan 2009 15:03:54 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id HZHcVKjTe4FhUC1j for ; Thu, 01 Jan 2009 15:03:54 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LIWa2-0007xE-67; Thu, 01 Jan 2009 23:03:54 +0000 Date: Thu, 1 Jan 2009 18:03:54 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss X-ASG-Orig-Subj: Re: [PATCH] remove flags param from xfs_free_eofblocks Subject: Re: [PATCH] remove flags param from xfs_free_eofblocks Message-ID: <20090101230354.GF7510@infradead.org> References: <495D478B.9080702@sandeen.net> <20090101225717.GE7510@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090101225717.GE7510@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-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: 1230851035 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com On Thu, Jan 01, 2009 at 05:57:17PM -0500, Christoph Hellwig wrote: > On Thu, Jan 01, 2009 at 04:45:31PM -0600, Eric Sandeen wrote: > > Remove unused XFS_FREE_EOF_NOLOCK and make XFS_FREE_EOF_LOCK default. > > > > XFS_FREE_EOF_NOLOCK is never used, so remove it, make > > XFS_FREE_EOF_LOCK the only behavior, and remove the > > flags parameters. > > Looks good to me. Actually it's used by dmapi, so we have to keep it. Would be nice if we actually had some uptodate tree with dmapi, though.. From sandeen@sandeen.net Thu Jan 1 17:04:42 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01N4f01002245 for ; Thu, 1 Jan 2009 17:04:42 -0600 X-ASG-Debug-ID: 1230851080-60e600f20000-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 9D5B51BF8588 for ; Thu, 1 Jan 2009 15:04:40 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id YyPtXvnOavZtUE7a for ; Thu, 01 Jan 2009 15:04:40 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id AE16BAC6273; Thu, 1 Jan 2009 17:04:40 -0600 (CST) Message-ID: <495D4C07.5050903@sandeen.net> Date: Thu, 01 Jan 2009 17:04:39 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.19 (Macintosh/20081209) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs-oss X-ASG-Orig-Subj: Re: [PATCH] remove flags param from xfs_free_eofblocks Subject: Re: [PATCH] remove flags param from xfs_free_eofblocks References: <495D478B.9080702@sandeen.net> <20090101225717.GE7510@infradead.org> <20090101230354.GF7510@infradead.org> In-Reply-To: <20090101230354.GF7510@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1230851080 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14185 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Christoph Hellwig wrote: > On Thu, Jan 01, 2009 at 05:57:17PM -0500, Christoph Hellwig wrote: >> On Thu, Jan 01, 2009 at 04:45:31PM -0600, Eric Sandeen wrote: >>> Remove unused XFS_FREE_EOF_NOLOCK and make XFS_FREE_EOF_LOCK default. >>> >>> XFS_FREE_EOF_NOLOCK is never used, so remove it, make >>> XFS_FREE_EOF_LOCK the only behavior, and remove the >>> flags parameters. >> Looks good to me. > > Actually it's used by dmapi, so we have to keep it. Would be nice if > we actually had some uptodate tree with dmapi, though.. > yep I had the wrong tree :( sorry for the noise. -Eric From sandeen@sandeen.net Thu Jan 1 17:08:50 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01N8ltB002546 for ; Thu, 1 Jan 2009 17:08:50 -0600 X-ASG-Debug-ID: 1230850228-135a025b0000-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 26D5958562 for ; Thu, 1 Jan 2009 14:50:28 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id 0vNzw8NMe5TNBiCc for ; Thu, 01 Jan 2009 14:50:28 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 4B637AC6273 for ; Thu, 1 Jan 2009 16:50:29 -0600 (CST) Message-ID: <495D48B3.2080708@sandeen.net> Date: Thu, 01 Jan 2009 16:50:27 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.19 (Macintosh/20081209) MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: [PATCH] remove always-true #ifndef HAVE_FORMAT32 tests Subject: [PATCH] remove always-true #ifndef HAVE_FORMAT32 tests Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1230850229 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14185 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- There are several tests for #ifndef HAVE_FORMAT32, but this is never defined anywhere so it is always the default behavior; just remove the ifndef goop. Signed-off-by: Eric Sandeen --- Index: xfs/fs/xfs/xfs_extfree_item.h =================================================================== --- xfs.orig/fs/xfs/xfs_extfree_item.h +++ xfs/fs/xfs/xfs_extfree_item.h @@ -33,12 +33,10 @@ typedef struct xfs_extent { * conversion routine. */ -#ifndef HAVE_FORMAT32 typedef struct xfs_extent_32 { __uint64_t ext_start; __uint32_t ext_len; } __attribute__((packed)) xfs_extent_32_t; -#endif typedef struct xfs_extent_64 { __uint64_t ext_start; @@ -59,7 +57,6 @@ typedef struct xfs_efi_log_format { xfs_extent_t efi_extents[1]; /* array of extents to free */ } xfs_efi_log_format_t; -#ifndef HAVE_FORMAT32 typedef struct xfs_efi_log_format_32 { __uint16_t efi_type; /* efi log item type */ __uint16_t efi_size; /* size of this item */ @@ -67,7 +64,6 @@ typedef struct xfs_efi_log_format_32 { __uint64_t efi_id; /* efi identifier */ xfs_extent_32_t efi_extents[1]; /* array of extents to free */ } __attribute__((packed)) xfs_efi_log_format_32_t; -#endif typedef struct xfs_efi_log_format_64 { __uint16_t efi_type; /* efi log item type */ @@ -90,7 +86,6 @@ typedef struct xfs_efd_log_format { xfs_extent_t efd_extents[1]; /* array of extents freed */ } xfs_efd_log_format_t; -#ifndef HAVE_FORMAT32 typedef struct xfs_efd_log_format_32 { __uint16_t efd_type; /* efd log item type */ __uint16_t efd_size; /* size of this item */ @@ -98,7 +93,6 @@ typedef struct xfs_efd_log_format_32 { __uint64_t efd_efi_id; /* id of corresponding efi */ xfs_extent_32_t efd_extents[1]; /* array of extents freed */ } __attribute__((packed)) xfs_efd_log_format_32_t; -#endif typedef struct xfs_efd_log_format_64 { __uint16_t efd_type; /* efd log item type */ Index: xfs/fs/xfs/xfs_inode_item.h =================================================================== --- xfs.orig/fs/xfs/xfs_inode_item.h +++ xfs/fs/xfs/xfs_inode_item.h @@ -40,7 +40,6 @@ typedef struct xfs_inode_log_format { __int32_t ilf_boffset; /* off of inode in buffer */ } xfs_inode_log_format_t; -#ifndef HAVE_FORMAT32 typedef struct xfs_inode_log_format_32 { __uint16_t ilf_type; /* inode log item type */ __uint16_t ilf_size; /* size of this item */ @@ -56,7 +55,6 @@ typedef struct xfs_inode_log_format_32 { __int32_t ilf_len; /* len of inode buffer */ __int32_t ilf_boffset; /* off of inode in buffer */ } __attribute__((packed)) xfs_inode_log_format_32_t; -#endif typedef struct xfs_inode_log_format_64 { __uint16_t ilf_type; /* inode log item type */ From mb@gem.win.co.nz Thu Jan 1 17:29:25 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01NTMJu004505 for ; Thu, 1 Jan 2009 17:29:25 -0600 X-ASG-Debug-ID: 1230852559-083b03730000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from isp.becroft.co.nz (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2D7075882E for ; Thu, 1 Jan 2009 15:29:20 -0800 (PST) Received: from isp.becroft.co.nz (isp.becroft.co.nz [202.89.33.33]) by cuda.sgi.com with ESMTP id s7ZrwuNjQGWR6qMS for ; Thu, 01 Jan 2009 15:29:20 -0800 (PST) Received: from server.ak.quickcircuit.co.nz (gateway.quickcircuit.co.nz [210.55.214.217]) by isp.becroft.co.nz (8.12.11.20060308/8.12.9) with ESMTP id n01NFk2u026819; Fri, 2 Jan 2009 12:15:47 +1300 To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS internal error when NFS client accesses nonexistent inode Subject: Re: XFS internal error when NFS client accesses nonexistent inode References: <87zlicfncr.fsf@server.ak.quickcircuit.co.nz> <20090101171409.GA18020@infradead.org> <20090101190039.GA29959@infradead.org> From: Mario Becroft Date: Fri, 02 Jan 2009 12:15:46 +1300 In-Reply-To: <20090101190039.GA29959@infradead.org> (Christoph Hellwig's message of "Thu\, 1 Jan 2009 14\:00\:39 -0500") Message-ID: <87ocyqpqhp.fsf@server.ak.quickcircuit.co.nz> User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Virus-Scanned: ClamAV version 0.88, clamav-milter version 0.87 on isp.becroft.co.nz X-Virus-Status: Clean X-Barracuda-Connect: isp.becroft.co.nz[202.89.33.33] X-Barracuda-Start-Time: 1230852561 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14187 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Christoph Hellwig writes: > Btw, you update /proc/sys/fs/xfs/error_level manually? The corruption > test only triggers from a avalue of 5, but 3 is the default. I was getting: Dec 31 09:12:46 nfs1 kernel: nfsd: non-standard errno: -117 and in trying to figure out what it meant, I bumped up the XFS debug level to 6, which enabled me to see the errors from XFS. Maybe I should have just left it alone? I should have pointed out that when this happened, the filesystem did not actually shut down. So it did not cause any real problems. Should it have been shutting down? I was mainly just worried that depending on what data it happened to hit when accessing the nonexistent inode, it might screw things up. If I do encounter any shutdowns, I will apply the patch you sent through. Thanks for the ultra-fast response. I realise preserving inode/generation numbers on dump/restore is probably hard and never going to happen. None of the other Linux filesystems I have looked at do it either. It would be very, very nice though... This is a feature I have wanted for ages. -- Mario Becroft From SRS0+5d7d118362e34cbfec1b+1957+infradead.org+hch@bombadil.srs.infradead.org Thu Jan 1 17:38:48 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01NcmOU005114 for ; Thu, 1 Jan 2009 17:38:48 -0600 X-ASG-Debug-ID: 1230852047-135a03160000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4592A5855C for ; Thu, 1 Jan 2009 15:20:47 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id SFO94DeAwBMp9SXC for ; Thu, 01 Jan 2009 15:20:47 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LIWps-0001bf-6A; Thu, 01 Jan 2009 23:20:16 +0000 Date: Thu, 1 Jan 2009 18:20:16 -0500 From: Christoph Hellwig To: Mario Becroft Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS internal error when NFS client accesses nonexistent inode Subject: Re: XFS internal error when NFS client accesses nonexistent inode Message-ID: <20090101232016.GA4476@infradead.org> References: <87zlicfncr.fsf@server.ak.quickcircuit.co.nz> <20090101171409.GA18020@infradead.org> <20090101190039.GA29959@infradead.org> <87ocyqpqhp.fsf@server.ak.quickcircuit.co.nz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <87ocyqpqhp.fsf@server.ak.quickcircuit.co.nz> User-Agent: Mutt/1.5.18 (2008-05-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: 1230852047 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com On Fri, Jan 02, 2009 at 12:15:46PM +1300, Mario Becroft wrote: > Christoph Hellwig writes: > > > Btw, you update /proc/sys/fs/xfs/error_level manually? The corruption > > test only triggers from a avalue of 5, but 3 is the default. > > I was getting: > > Dec 31 09:12:46 nfs1 kernel: nfsd: non-standard errno: -117 > > and in trying to figure out what it meant, I bumped up the XFS debug > level to 6, which enabled me to see the errors from XFS. Maybe I should > have just left it alone? > > I should have pointed out that when this happened, the filesystem did > not actually shut down. So it did not cause any real problems. Should it > have been shutting down? > > I was mainly just worried that depending on what data it happened to hit Looking at the code again there indeed aren't shutdowns, just stacktraces. So yes, the stacktraces are caused by the higher error level. With debug kernels it's still a kernel crash though, but no one should run debug kernels on their production machines. > when accessing the nonexistent inode, it might screw things up. If I do > encounter any shutdowns, I will apply the patch you sent through. Thanks > for the ultra-fast response. Please try the second patch which I cc'ed you on as it gives back the correct error code to the nfs clients. From david@fromorbit.com Thu Jan 1 17:54:55 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n01NsqAs006599 for ; Thu, 1 Jan 2009 17:54:55 -0600 X-ASG-Debug-ID: 1230854090-6df0034b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail05.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A49471BF85CE for ; Thu, 1 Jan 2009 15:54:50 -0800 (PST) Received: from ipmail05.adl2.internode.on.net (ipmail05.adl2.internode.on.net [203.16.214.145]) by cuda.sgi.com with ESMTP id XlLdQ6iFPR6Uh5iI for ; Thu, 01 Jan 2009 15:54:50 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqUCAKbkXEl5LB1fgWdsb2JhbACTewEBFiK2NYVy X-IronPort-AV: E=Sophos;i="4.36,315,1228051800"; d="scan'208";a="285410379" Received: from ppp121-44-29-95.lns10.syd7.internode.on.net (HELO disturbed) ([121.44.29.95]) by ipmail05.adl2.internode.on.net with ESMTP; 02 Jan 2009 10:24:48 +1030 Received: from dave by disturbed with local (Exim 4.69) (envelope-from ) id 1LIXNH-0005P7-61; Fri, 02 Jan 2009 10:54:47 +1100 Date: Fri, 2 Jan 2009 10:54:47 +1100 From: Dave Chinner To: Elrond , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfsaild wakeups Subject: Re: xfsaild wakeups Message-ID: <20090101235447.GH10725@disturbed> Mail-Followup-To: Elrond , xfs@oss.sgi.com References: <20081229232915.GA6724@memak.tu-darmstadt.de> <20081230233522.GB10725@disturbed> <20081231153050.GA18736@memak.tu-darmstadt.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20081231153050.GA18736@memak.tu-darmstadt.de> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: ipmail05.adl2.internode.on.net[203.16.214.145] X-Barracuda-Start-Time: 1230854091 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.1.14189 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Dec 31, 2008 at 04:30:50PM +0100, Elrond wrote: > On Wed, Dec 31, 2008 at 10:35:22AM +1100, Dave Chinner wrote: > > On Tue, Dec 30, 2008 at 12:29:15AM +0100, Elrond wrote: > > > > > > Hi, > > > > > > The major issue of xfsaild wakeups was analyzed in > > > February. (see > > > http://oss.sgi.com/archives/xfs/2008-02/msg00169.html ). > > > > > > A small issue persists. We're now at 1 wakeup per second > > > and mounted filesystem. I have three xfs on my box and the > > > number wants to grow. xfsaild is on place two of my > > > powertop wakeup list. Sometimes place one. > > > > > > Is anyone working on reducing this to zero for an idle fs? > > > > It's on the list of things to do given that 2.6.29 will have > > the fix for the bug that the periodic wakeup is catching. > > So the xfs part is mostly prepared and when 2.6.29 has the > base fix, xfs will follow soon? It's all XFS stuff ;) What I mean is that the underlying XFS problem that required the AIL watchdog (the 1s wakeup) is now fixed so we can remove the periodic wakeup. That removal will probably be in 2.6.30.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From thomas.gutzler@gmail.com Thu Jan 1 20:46:29 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=BAYES_00,J_CHICKENPOX_23 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n022kSuH017974 for ; Thu, 1 Jan 2009 20:46:29 -0600 X-ASG-Debug-ID: 1230864385-7c2f00450000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ti-out-0910.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B844158C5C for ; Thu, 1 Jan 2009 18:46:26 -0800 (PST) Received: from ti-out-0910.google.com (ti-out-0910.google.com [209.85.142.189]) by cuda.sgi.com with ESMTP id sAK6aEeJKxZD2oEj for ; Thu, 01 Jan 2009 18:46:26 -0800 (PST) Received: by ti-out-0910.google.com with SMTP id y6so5391609tia.18 for ; Thu, 01 Jan 2009 18:46:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to :subject:mime-version:content-type:content-transfer-encoding :content-disposition; bh=r2t1CMjJ3+pTUWqQIGtkjyJxJKrVBEHtAXGskzah4RA=; b=MwY8lBhBCzeznQsbE3xH4r89XEXoA6AsQ+hPYlWGxEycpPqnTx5RV1L7EU+VhCXDQc 2fRlu1U8fR7PvqTaPHChjzivnhA84JOf+dfFH1HN5M6+N118m5LJyWk1VUp8P8iXpE1v WDOP15/2iPaNCv5Bu+DDTUaAX6u0VrM/hvwl0= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:mime-version:content-type :content-transfer-encoding:content-disposition; b=cG0HHCu68vnB8oMC4sNo5CgxrY84jCrtW87iMU255ie+4o0Wct+KTJMAuJbVCVlhh4 bDqES6ZdhLEYt0cX5AZy1wOfeGmo/u3Ep+WCimHHN/zI7hxZRUgmeNqOh9NBUeOOaAdf e1G7/4k12I662jWESypWinb15I5o5xeutDOsE= Received: by 10.110.109.12 with SMTP id h12mr26692370tic.56.1230864383768; Thu, 01 Jan 2009 18:46:23 -0800 (PST) Received: by 10.110.17.11 with HTTP; Thu, 1 Jan 2009 18:46:23 -0800 (PST) Message-ID: <169670ec0901011846q1d370e6cu31514519afc8295d@mail.gmail.com> Date: Fri, 2 Jan 2009 11:46:23 +0900 From: "Thomas Gutzler" To: xfs@oss.sgi.com X-ASG-Orig-Subj: Corruption of in-memory data detected Subject: Corruption of in-memory data detected MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-Disposition: inline X-Barracuda-Connect: ti-out-0910.google.com[209.85.142.189] X-Barracuda-Start-Time: 1230864387 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14198 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi, I've been running an 8x500G hardware SATA RAID5 on an adaptec 31605 controller for a while. The operating system is ubuntu feisty with the 2.6.22-16-server kernel. Recently, I added a disk. After the array rebuild was completed, I kept getting errors from the xfs module such as this one: Dec 30 22:55:39 io kernel: [21844.939832] Filesystem "sda": xfs_iflush: Bad inode 1610669723 magic number 0xec9d, ptr 0xe523eb00 Dec 30 22:55:39 io kernel: [21844.939879] xfs_force_shutdown(sda,0x8) called from line 3277 of file /build/buildd/linux-source-2.6.22-2.6.22/fs/xfs/xfs_inode.c. Return address = 0xf8af263c Dec 30 22:55:39 io kernel: [21844.939885] Filesystem "sda": Corruption of in-memory data detected. Shutting down filesystem: sda My first thought was to run memcheck on the machine, which completed several passes without error; the raid controller doesn't report any SMART failures either. After an xfs_repair, which fixed a few things, I mounted the file system but the error kept reappearing after a few hours unless I mounted read-only. Since xfs_ncheck -i always exited with 'Out of memory' I decided to reduce the max amount of inodes to 1% (156237488) by running xfs_growfs -m 1 - the total amount of inodes used is still less than 1%. Unfortunately, both xfs_check and xfs_ncheck still say 'out of memory' with 2GB installed. . After the modification, the file system survived for a day until the following happened: Jan 2 09:33:29 io kernel: [232751.699812] BUG: unable to handle kernel paging request at virtual address 0003fffb Jan 2 09:33:29 io kernel: [232751.699848] printing eip: Jan 2 09:33:29 io kernel: [232751.699863] c017d872 Jan 2 09:33:29 io kernel: [232751.699865] *pdpt = 000000003711e001 Jan 2 09:33:29 io kernel: [232751.699881] *pde = 0000000000000000 Jan 2 09:33:29 io kernel: [232751.699898] Oops: 0002 [#1] Jan 2 09:33:29 io kernel: [232751.699913] SMP Jan 2 09:33:29 io kernel: [232751.699931] Modules linked in: nfs nfsd exportfs lockd sunrpc xt_tcpudp nf_conntrack_ipv4 xt_state nf_conntrack nfnetlink iptable_filter ip_tables x_tables ipv6 ext2 mbcache coretemp w83627ehf i2c_isa i2c_core acpi_cpufreq cpufreq_userspace cpufreq_stats cpufreq_powersave cpufreq_ondemand freq_table cpufreq_conservative psmouse serio_raw pcspkr shpchp pci_hotplug evdev intel_agp agpgart xfs sr_mod cdrom pata_jmicron ata_piix sg sd_mod ata_generic ohci1394 ieee1394 ahci libata e1000 aacraid scsi_mod uhci_hcd ehci_hcd usbcore thermal processor fan fuse apparmor commoncap Jan 2 09:33:29 io kernel: [232751.700180] CPU: 1 Jan 2 09:33:29 io kernel: [232751.700181] EIP: 0060:[__slab_free+50/672] Not tainted VLI Jan 2 09:33:29 io kernel: [232751.700182] EFLAGS: 00010046 (2.6.22-16-server #1) Jan 2 09:33:29 io kernel: [232751.700234] EIP is at __slab_free+0x32/0x2a0 Jan 2 09:33:29 io kernel: [232751.700252] eax: 0000ffff ebx: ffffffff ecx: ffffffff edx: 000014aa Jan 2 09:33:29 io kernel: [232751.700273] esi: c17fffe0 edi: e6b8e0c0 ebp: f8ac2c8c esp: c21dfe44 Jan 2 09:33:29 io kernel: [232751.700293] ds: 007b es: 007b fs: 00d8 gs: 0000 ss: 0068 Jan 2 09:33:29 io kernel: [232751.700313] Process kswapd0 (pid: 198, ti=c21de000 task=c21f39f0 task.ti=c21de000) Jan 2 09:33:29 io kernel: [232751.700334] Stack: 00000000 00000065 00000000 fffffffe ffffffff c17fffe0 00000287 e6b8e0c0 Jan 2 09:33:29 io kernel: [232751.700378] 00000001 c017e3fe f8ac2c8c cecb7d20 00000001 df2e2600 f8ac2c8c df2e2600 Jan 2 09:33:29 io kernel: [232751.700422] f8d7559c e8247900 f8ac5224 df2e2600 f8d7559c e8247900 f8ae1606 00000001 Jan 2 09:33:29 io kernel: [232751.700466] Call Trace: Jan 2 09:33:29 io kernel: [232751.700499] [kfree+126/192] kfree+0x7e/0xc0 Jan 2 09:33:29 io kernel: [232751.700519] [] xfs_idestroy_fork+0x2c/0xf0 [xfs] Jan 2 09:33:29 io kernel: [232751.700561] [] xfs_idestroy_fork+0x2c/0xf0 [xfs] Jan 2 09:33:29 io kernel: [232751.700601] [] xfs_idestroy+0x44/0xb0 [xfs] Jan 2 09:33:29 io kernel: [232751.700640] [] xfs_finish_reclaim+0x36/0x160 [xfs] Jan 2 09:33:29 io kernel: [232751.700681] [] xfs_fs_clear_inode+0x97/0xc0 [xfs] Jan 2 09:33:29 io kernel: [232751.700721] [clear_inode+143/320] clear_inode+0x8f/0x140 Jan 2 09:33:29 io kernel: [232751.700743] [dispose_list+26/224] dispose_list+0x1a/0xe0 Jan 2 09:33:29 io kernel: [232751.700765] [shrink_icache_memory+379/592] shrink_icache_memory+0x17b/0x250 Jan 2 09:33:29 io kernel: [232751.700789] [shrink_slab+279/368] shrink_slab+0x117/0x170 Jan 2 09:33:29 io kernel: [232751.700815] [kswapd+859/1136] kswapd+0x35b/0x470 Jan 2 09:33:29 io kernel: [232751.700842] [autoremove_wake_function+0/80] autoremove_wake_function+0x0/0x50 Jan 2 09:33:29 io kernel: [232751.700867] [kswapd+0/1136] kswapd+0x0/0x470 Jan 2 09:33:29 io kernel: [232751.700886] [kthread+66/112] kthread+0x42/0x70 Jan 2 09:33:29 io kernel: [232751.700904] [kthread+0/112] kthread+0x0/0x70 Jan 2 09:33:29 io kernel: [232751.700923] [kernel_thread_helper+7/28] kernel_thread_helper+0x7/0x1c Jan 2 09:33:29 io kernel: [232751.700946] ======================= Jan 2 09:33:29 io kernel: [232751.700962] Code: 53 89 cb 83 ec 14 8b 6c 24 28 f0 0f ba 2e 00 19 c0 85 c0 74 0a 8b 06 a8 01 74 ef f3 90 eb f6 f6 06 02 75 48 0f b7 46 0a 8b 56 14 <89> 14 83 0f b7 46 08 89 5e 14 83 e8 01 f6 06 40 66 89 46 08 75 Jan 2 09:33:29 io kernel: [232751.701128] EIP: [__slab_free+50/672] __slab_free+0x32/0x2a0 SS:ESP 0068:c21dfe44 Any thoughts what this could be or what could be done to fix it? Cheers, Tom From sandeen@sandeen.net Thu Jan 1 21:24:34 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.2 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_23 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n023OYdj020689 for ; Thu, 1 Jan 2009 21:24:34 -0600 X-ASG-Debug-ID: 1230866672-7c2e01a30000-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 E84F358C99 for ; Thu, 1 Jan 2009 19:24:32 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id 9iR9Q5toQcGjGnns for ; Thu, 01 Jan 2009 19:24:32 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id B975EAC6273; Thu, 1 Jan 2009 21:24:31 -0600 (CST) Message-ID: <495D88EE.2040406@sandeen.net> Date: Thu, 01 Jan 2009 21:24:30 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.19 (Macintosh/20081209) MIME-Version: 1.0 To: Thomas Gutzler CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Corruption of in-memory data detected Subject: Re: Corruption of in-memory data detected References: <169670ec0901011846q1d370e6cu31514519afc8295d@mail.gmail.com> In-Reply-To: <169670ec0901011846q1d370e6cu31514519afc8295d@mail.gmail.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1230866672 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14202 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Thomas Gutzler wrote: > Hi, > > I've been running an 8x500G hardware SATA RAID5 on an adaptec 31605 > controller for a while. The operating system is ubuntu feisty with the > 2.6.22-16-server kernel. Recently, I added a disk. After the array > rebuild was completed, I kept getting errors from the xfs module such > as this one: > Dec 30 22:55:39 io kernel: [21844.939832] Filesystem "sda": > xfs_iflush: Bad inode 1610669723 magic number 0xec9d, ptr 0xe523eb00 > Dec 30 22:55:39 io kernel: [21844.939879] xfs_force_shutdown(sda,0x8) > called from line 3277 of file > /build/buildd/linux-source-2.6.22-2.6.22/fs/xfs/xfs_inode.c. Return > address = 0xf8af263c > Dec 30 22:55:39 io kernel: [21844.939885] Filesystem "sda": Corruption > of in-memory data detected. Shutting down filesystem: sda > > My first thought was to run memcheck on the machine, which completed > several passes without error; the raid controller doesn't report any > SMART failures either. Both good ideas, but note that "Corruption of in-memory data detected" doesn't necessarily mean bad memory (though it might, so memcheck was prudent). 0xec9d is not the correct magic nr. for an on-disk inode, so that's why things went south. Were there no storage related errors prior to this? > After an xfs_repair, which fixed a few things, Knowing which things were fixed might lend some clues ... > I mounted the file > system but the error kept reappearing after a few hours unless I > mounted read-only. Since xfs_ncheck -i always exited with 'Out of > memory' xfs_check takes a ton of memory; xfs_repair much less so > I decided to reduce the max amount of inodes to 1% (156237488) > by running xfs_growfs -m 1 - the total amount of inodes used is still > less than 1%. Unfortunately, both xfs_check and xfs_ncheck still say > 'out of memory' with 2GB installed. the max inodes really have no bearing on check or repair memory usage; it's just an upper limit on how many inodes *could* be created. > After the modification, the file system survived for a day until the > following happened: > Jan 2 09:33:29 io kernel: [232751.699812] BUG: unable to handle > kernel paging request at virtual address 0003fffb > Jan 2 09:33:29 io kernel: [232751.699848] printing eip: > Jan 2 09:33:29 io kernel: [232751.699863] c017d872 > Jan 2 09:33:29 io kernel: [232751.699865] *pdpt = 000000003711e001 > Jan 2 09:33:29 io kernel: [232751.699881] *pde = 0000000000000000 > Jan 2 09:33:29 io kernel: [232751.699898] Oops: 0002 [#1] > Jan 2 09:33:29 io kernel: [232751.699913] SMP > Jan 2 09:33:29 io kernel: [232751.699931] Modules linked in: nfs nfsd > exportfs lockd sunrpc xt_tcpudp nf_conntrack_ipv4 xt_state > nf_conntrack nfnetlink iptable_filter ip_tables x_tables ipv6 ext2 > mbcache coretemp w83627ehf i2c_isa i2c_core acpi_cpufreq > cpufreq_userspace cpufreq_stats cpufreq_powersave cpufreq_ondemand > freq_table cpufreq_conservative psmouse serio_raw pcspkr shpchp > pci_hotplug evdev intel_agp agpgart xfs sr_mod cdrom pata_jmicron > ata_piix sg sd_mod ata_generic ohci1394 ieee1394 ahci libata e1000 > aacraid scsi_mod uhci_hcd ehci_hcd usbcore thermal processor fan fuse > apparmor commoncap > Jan 2 09:33:29 io kernel: [232751.700180] CPU: 1 > Jan 2 09:33:29 io kernel: [232751.700181] EIP: > 0060:[__slab_free+50/672] Not tainted VLI > Jan 2 09:33:29 io kernel: [232751.700182] EFLAGS: 00010046 > (2.6.22-16-server #1) > Jan 2 09:33:29 io kernel: [232751.700234] EIP is at __slab_free+0x32/0x2a0 Memory corruption perhaps? > Jan 2 09:33:29 io kernel: [232751.700252] eax: 0000ffff ebx: > ffffffff ecx: ffffffff edx: 000014aa > Jan 2 09:33:29 io kernel: [232751.700273] esi: c17fffe0 edi: > e6b8e0c0 ebp: f8ac2c8c esp: c21dfe44 > Jan 2 09:33:29 io kernel: [232751.700293] ds: 007b es: 007b fs: > 00d8 gs: 0000 ss: 0068 > Jan 2 09:33:29 io kernel: [232751.700313] Process kswapd0 (pid: 198, > ti=c21de000 task=c21f39f0 task.ti=c21de000) > Jan 2 09:33:29 io kernel: [232751.700334] Stack: 00000000 00000065 > 00000000 fffffffe ffffffff c17fffe0 00000287 e6b8e0c0 > Jan 2 09:33:29 io kernel: [232751.700378] 00000001 c017e3fe > f8ac2c8c cecb7d20 00000001 df2e2600 f8ac2c8c df2e2600 > Jan 2 09:33:29 io kernel: [232751.700422] f8d7559c e8247900 > f8ac5224 df2e2600 f8d7559c e8247900 f8ae1606 00000001 > Jan 2 09:33:29 io kernel: [232751.700466] Call Trace: > Jan 2 09:33:29 io kernel: [232751.700499] [kfree+126/192] kfree+0x7e/0xc0 > Jan 2 09:33:29 io kernel: [232751.700519] [] > xfs_idestroy_fork+0x2c/0xf0 [xfs] > Jan 2 09:33:29 io kernel: [232751.700561] [] > xfs_idestroy_fork+0x2c/0xf0 [xfs] > Jan 2 09:33:29 io kernel: [232751.700601] [] > xfs_idestroy+0x44/0xb0 [xfs] > Jan 2 09:33:29 io kernel: [232751.700640] [] > xfs_finish_reclaim+0x36/0x160 [xfs] > Jan 2 09:33:29 io kernel: [232751.700681] [] > xfs_fs_clear_inode+0x97/0xc0 [xfs] > Jan 2 09:33:29 io kernel: [232751.700721] [clear_inode+143/320] > clear_inode+0x8f/0x140 > Jan 2 09:33:29 io kernel: [232751.700743] [dispose_list+26/224] > dispose_list+0x1a/0xe0 > Jan 2 09:33:29 io kernel: [232751.700765] > [shrink_icache_memory+379/592] shrink_icache_memory+0x17b/0x250 > Jan 2 09:33:29 io kernel: [232751.700789] [shrink_slab+279/368] > shrink_slab+0x117/0x170 > Jan 2 09:33:29 io kernel: [232751.700815] [kswapd+859/1136] kswapd+0x35b/0x470 > Jan 2 09:33:29 io kernel: [232751.700842] > [autoremove_wake_function+0/80] autoremove_wake_function+0x0/0x50 > Jan 2 09:33:29 io kernel: [232751.700867] [kswapd+0/1136] kswapd+0x0/0x470 > Jan 2 09:33:29 io kernel: [232751.700886] [kthread+66/112] kthread+0x42/0x70 > Jan 2 09:33:29 io kernel: [232751.700904] [kthread+0/112] kthread+0x0/0x70 > Jan 2 09:33:29 io kernel: [232751.700923] > [kernel_thread_helper+7/28] kernel_thread_helper+0x7/0x1c > Jan 2 09:33:29 io kernel: [232751.700946] ======================= > Jan 2 09:33:29 io kernel: [232751.700962] Code: 53 89 cb 83 ec 14 8b > 6c 24 28 f0 0f ba 2e 00 19 c0 85 c0 74 0a 8b 06 a8 01 74 ef f3 90 eb > f6 f6 06 02 75 48 0f b7 46 0a 8b 56 14 <89> 14 83 0f b7 46 08 89 5e 14 > 83 e8 01 f6 06 40 66 89 46 08 75 > Jan 2 09:33:29 io kernel: [232751.701128] EIP: [__slab_free+50/672] > __slab_free+0x32/0x2a0 SS:ESP 0068:c21dfe44 > > Any thoughts what this could be or what could be done to fix it? seems like maybe something went wrong w/ the raid rebuild, if that's when things started going south. Do you get any storage error related messages at all? Ubuntu knows best what's in this oldish distro kernel, I guess; I don't know offhand what might be going wrong. If they have a debug kernel variant, you could run that to see if you get earlier indications of problems. If you can reproduce on a more recent upstream kernel, that would be interesting. -Eric > Cheers, > Tom From sandeen@sandeen.net Thu Jan 1 21:47:54 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_53, J_CHICKENPOX_74,J_CHICKENPOX_83 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n023lrSD022002 for ; Thu, 1 Jan 2009 21:47:54 -0600 X-ASG-Debug-ID: 1230868069-190102fa0000-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 702F01BF8A21 for ; Thu, 1 Jan 2009 19:47:49 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id 3QdOpB8Ts97JgPZK for ; Thu, 01 Jan 2009 19:47:49 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id CFB4DAC6273 for ; Thu, 1 Jan 2009 21:47:49 -0600 (CST) Message-ID: <495D8E64.5070206@sandeen.net> Date: Thu, 01 Jan 2009 21:47:48 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.19 (Macintosh/20081209) MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: [PATCH] xfstests Makepkgs framework, builds rpms Subject: [PATCH] xfstests Makepkgs framework, builds rpms References: <495D42CE.6060806@sandeen.net> In-Reply-To: <495D42CE.6060806@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1230868072 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14202 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- With the install target in place, this lets us do Makepkgs: == dist, log is Logs/dist Wrote: /root/src/xfstests-dev.work/build/xfstests-1.0.0.src.tar.gz Wrote: /root/src/xfstests-dev.work/build/tar/xfstests-1.0.0.tar.gz Wrote: /root/src/xfstests-dev.work/build/rpm/xfstests-1.0.0-1.src.rpm Wrote: /root/src/xfstests-dev.work/build/rpm/xfstests-1.0.0-1.x86_64.rpm It's all largely cut & pasted from the xfsprogs framework. I'll let the debian elves do the things they do for debian packaging if they're interested... xfstests could use more work to make it package-friendly but this is a good start at least. Signed-off-by: Eric Sandeen --- Index: xfstests-dev.work/Makepkgs =================================================================== --- /dev/null +++ xfstests-dev.work/Makepkgs @@ -0,0 +1,88 @@ +#! /bin/sh +# +# Make whichever packages have been requested. +# Defaults to RPMs. +# +LOGDIR=Logs + +type=rpm +verbose=false + +MAKE=${MAKE:-make} +test ! -z "$MAKE" && make=$MAKE + +for opt in $* +do + case "$opt" in + clean) + ;; # ignored, kept for backward compatibility + rpm) + type=rpm ;; + debian) + type=debian ;; + verbose) + verbose=true ;; + *) + echo "Usage: Makepkgs [verbose] [debian|rpm]"; exit 1 ;; + esac +done + +# start with a clean manifest +test -f files.rpm && rm -f files.rpm +test -f filesdevel.rpm && rm -f filesdevel.rpm +test -f fileslib.rpm && rm -f fileslib.rpm + +test ! -d $LOGDIR && mkdir $LOGDIR +rm -rf $LOGDIR/* > /dev/null 2>&1 + +# build Debian packages, cleans itself before starting +SUDO=${SUDO:-sudo} +test ! -z "$SUDO" && sudo=$SUDO +if [ $type = debian ] ; then + LOGDEB=`pwd` + LOGDEB=../`basename $LOGDEB`.log + echo "== Debian build, log is $LOGDEB"; echo + if $verbose ; then + dpkg-buildpackage -r$SUDO | tee $LOGDEB + else + dpkg-buildpackage -r$SUDO > $LOGDEB || exit 1 + fi + exit 0 +fi + +# build RPM packages - manual clean before starting +echo "== clean, log is $LOGDIR/clean" +if $verbose ; then + $MAKE clean 2>&1 | tee $LOGDIR/clean +else + $MAKE clean > $LOGDIR/clean 2>&1 || exit 1 +fi + +echo +echo "== configure, log is $LOGDIR/configure" +rm -f .census # force configure to run here +if $verbose ; then + $MAKE configure 2>&1 | tee $LOGDIR/configure +else + $MAKE configure > $LOGDIR/configure 2>&1 || exit 1 +fi + +echo +echo "== default, log is $LOGDIR/default" +if $verbose ; then + $MAKE default 2>&1 | tee $LOGDIR/default +else + $MAKE default > $LOGDIR/default 2>&1 || exit 1 +fi + +echo +echo "== dist, log is $LOGDIR/dist" +[ ! -f .census ] && touch .census +if $verbose ; then + $MAKE -C build dist 2>&1 | tee $LOGDIR/dist +else + $MAKE -C build dist > $LOGDIR/dist 2>&1 || exit 1 + grep '^Wrote:' $LOGDIR/dist | sed -e 's/\.\.\/\.\.\///' +fi + +exit 0 Index: xfstests-dev.work/build/rpm/macros.template =================================================================== --- /dev/null +++ xfstests-dev.work/build/rpm/macros.template @@ -0,0 +1,30 @@ +# +# rpmrc.template +# +# Template to fudge rpm directory structure inside IRIX-like build +# environment + +# Force 386 build on all platforms +%_target i386-pc-linux +%_target_cpu i386 +%_target_os linux + +# topdir == $(WORKAREA) +%_topdir %topdir% + +# Following directories are specific to the topdir +# This is where build is done. In our case it's the same as $WORKAREA +%_builddir %topdir% + +# This is where foo.1.99.tar.gz is living in the real world. +# Be careful not to run full rpm build as it will override the sources +%_sourcedir %topdir%/build + +# This is where binary RPM and source RPM would end up +%_rpmdir %topdir%/build/rpm +%_srcrpmdir %topdir%/build/rpm +%_specdir %topdir%/build/rpm + +# Leave RPM files in the same directory - we're not building for +# multiple architectures +%_rpmfilename %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm Index: xfstests-dev.work/build/rpm/xfstests.spec.in =================================================================== --- /dev/null +++ xfstests-dev.work/build/rpm/xfstests.spec.in @@ -0,0 +1,49 @@ +Summary: XFS regression test suite +Name: @pkg_name@ +Version: @pkg_version@ +Release: @pkg_release@ +Distribution: @pkg_distribution@ +Packager: Silicon Graphics, Inc. +BuildRoot: @build_root@ +BuildRequires: autoconf, xfsprogs-devel, e2fsprogs-devel +BuildREquires: libacl-devel, libattr-devel, libaio-devel +Requires: bash, xfsprogs, xfsdump, perl, acl, attr, bind-utils +Requires: bc, indent, quota +Source: @pkg_name@-@pkg_version@.src.tar.gz +License: GPL2+ +Vendor: Silicon Graphics, Inc. +URL: http://oss.sgi.com/projects/xfs/ +Group: System Environment/Base + +%description +The XFS regression test suite. Also includes some support for +acl, attr, dmapi, udf, and nfs testing. Contains around 200 specific tests +for userspace & kernelspace. + +%prep +if [ -f .census ] ; then + if [ ! -d ${RPM_PACKAGE_NAME}-${RPM_PACKAGE_VERSION} ] ; then + ln -s . ${RPM_PACKAGE_NAME}-${RPM_PACKAGE_VERSION} + fi +else +%setup +INSTALL_USER=root +INSTALL_GROUP=root +export INSTALL_USER INSTALL_GROUP +@make@ configure +fi + +%build +@make@ + +%install +DIST_ROOT="$RPM_BUILD_ROOT" +DIST_INSTALL=`pwd`/install.manifest +export DIST_ROOT DIST_INSTALL +@make@ install DIST_MANIFEST="$DIST_INSTALL" +@make@ -C build/rpm rpmfiles DIST_MANIFEST="$DIST_INSTALL" + +%clean +rm -rf $RPM_BUILD_ROOT + +%files -f build/rpm/rpmfiles From sandeen@sandeen.net Thu Jan 1 22:01:39 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n0241dxx023004 for ; Thu, 1 Jan 2009 22:01:39 -0600 X-ASG-Debug-ID: 1230868897-4f7100ba0000-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 C2068176A80A for ; Thu, 1 Jan 2009 20:01:37 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id psF2aTxVLDAeiApO for ; Thu, 01 Jan 2009 20:01:37 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 1A461AC6273 for ; Thu, 1 Jan 2009 22:01:38 -0600 (CST) Message-ID: <495D91A0.4050304@sandeen.net> Date: Thu, 01 Jan 2009 22:01:36 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.19 (Macintosh/20081209) MIME-Version: 1.0 To: xfs-oss X-ASG-Orig-Subj: oopses in xfs_attr_shortform_* on kerneloops.org Subject: oopses in xfs_attr_shortform_* on kerneloops.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1230868897 X-Barracuda-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.1.14204 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE_7582B Custom Rule 7582B I noticed this on kerneloops.org and pinged Christoph about it but I'll go ahead & point it out here & file a bug so it doesn't get lost: http://www.kerneloops.org/search.php?search=xfs_attr_shortform&btnG=Function+Search would seem to indicate a problem, though not a (recent) regression anyway. Many traces like: RIP: 0010:[] [] :xfs:xfs_attr_shortform_getvalue+0x27/0xf3 ... Call Trace: [] :xfs:xfs_attr_fetch+0xba/0x114 [] ? inotify_d_instantiate+0x1a/0x42 [] :xfs:xfs_attr_get+0xb1/0xd1 [] :xfs:attr_generic_get+0x1e/0x2e [] :xfs:xfs_vn_getxattr+0x86/0x95 [] vfs_getxattr+0xa1/0xb4 [] getxattr+0x9c/0xfb [] ? mntput_no_expire+0x20/0x85 [] ? path_put+0x2c/0x30 [] ? path_walk+0xb6/0xc3 [] ? do_path_lookup+0x1d6/0x231 [] ? putname+0x30/0x39 [] ? __user_walk_fd+0x4c/0x5c [] sys_lgetxattr+0x53/0x73 [] ? sys_newlstat+0x31/0x3c [] system_call_after_swapgs+0x7b/0x80 -Eric From sandeen@sandeen.net Thu Jan 1 23:22:19 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n025MJHW027990 for ; Thu, 1 Jan 2009 23:22:19 -0600 X-ASG-Debug-ID: 1230873737-591400810000-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 4F11158D94 for ; Thu, 1 Jan 2009 21:22:17 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id YwUIAlA7tA3kn07x for ; Thu, 01 Jan 2009 21:22:17 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 1B297A9FEA2; Thu, 1 Jan 2009 23:22:18 -0600 (CST) Message-ID: <495DA488.7080702@sandeen.net> Date: Thu, 01 Jan 2009 23:22:16 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.19 (Macintosh/20081209) MIME-Version: 1.0 To: Takashi Sato CC: Andrew Morton , Christoph Hellwig , "linux-fsdevel@vger.kernel.org" , "dm-devel@redhat.com" , "viro@ZenIV.linux.org.uk" , "linux-ext4@vger.kernel.org" , "xfs@oss.sgi.com" , "mtk.manpages@googlemail.com" , "axboe@kernel.dk" , "linux-kernel@vger.kernel.org" X-ASG-Orig-Subj: Re: [PATCH 0/3] freeze feature ver 1.14 Subject: Re: [PATCH 0/3] freeze feature ver 1.14 References: <20081027215811t-sato@mail.jp.nec.com> In-Reply-To: <20081027215811t-sato@mail.jp.nec.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1230873738 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14209 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- In lieu of the timeout feature which was originally proposed, how about access to an emergency un-freeze via magic sysrq, maybe piggy-backed on emergency sync... something like this (not tested or even built yet...), would this be a good compromise to help save people from frozen roots? -Eric Index: linux-2.6/drivers/char/sysrq.c =================================================================== --- linux-2.6.orig/drivers/char/sysrq.c +++ linux-2.6/drivers/char/sysrq.c @@ -151,6 +151,7 @@ static struct sysrq_key_op sysrq_reboot_ static void sysrq_handle_sync(int key, struct tty_struct *tty) { + emergency_thaw(); emergency_sync(); } static struct sysrq_key_op sysrq_sync_op = { Index: linux-2.6/drivers/md/dm.c =================================================================== --- linux-2.6.orig/drivers/md/dm.c +++ linux-2.6/drivers/md/dm.c @@ -1477,7 +1477,7 @@ static void unlock_fs(struct mapped_devi if (!test_bit(DMF_FROZEN, &md->flags)) return; - thaw_bdev(md->suspended_bdev, md->frozen_sb); + thaw_bdev(md->suspended_bdev, md->frozen_sb, 0); md->frozen_sb = NULL; clear_bit(DMF_FROZEN, &md->flags); } Index: linux-2.6/fs/buffer.c =================================================================== --- linux-2.6.orig/fs/buffer.c +++ linux-2.6/fs/buffer.c @@ -259,13 +259,29 @@ struct super_block *freeze_bdev(struct b EXPORT_SYMBOL(freeze_bdev); /** + * emergency_thaw -- force thaw every filesystem + * + * Used for emergency unfreeze of all filesystems via SysRq + */ +void emergency_thaw(void) +{ + struct super_block *sb; + + list_for_each_entry(sb, &super_blocks, s_list) { + if (sb->s_bdev) + (void)thaw_bdev(sb->s_bdev, sb, 1); + } +} + +/** * thaw_bdev -- unlock filesystem * @bdev: blockdevice to unlock * @sb: associated superblock + * force: force unfreeze regardless of freezer count * * Unlocks the filesystem and marks it writeable again after freeze_bdev(). */ -int thaw_bdev(struct block_device *bdev, struct super_block *sb) +int thaw_bdev(struct block_device *bdev, struct super_block *sb, int force) { int error = 0; @@ -275,7 +291,11 @@ int thaw_bdev(struct block_device *bdev, return -EINVAL; } - bdev->bd_fsfreeze_count--; + if (force) + bdev->bd_fsfreeze_count = 0; + else + bdev->bd_fsfreeze_count--; + if (bdev->bd_fsfreeze_count > 0) { if (sb) drop_super(sb); Index: linux-2.6/fs/ioctl.c =================================================================== --- linux-2.6.orig/fs/ioctl.c +++ linux-2.6/fs/ioctl.c @@ -449,7 +449,7 @@ static int ioctl_fsthaw(struct file *fil return -EINVAL; /* Thaw */ - return thaw_bdev(sb->s_bdev, sb); + return thaw_bdev(sb->s_bdev, sb, 0); } /* Index: linux-2.6/fs/xfs/xfs_fsops.c =================================================================== --- linux-2.6.orig/fs/xfs/xfs_fsops.c +++ linux-2.6/fs/xfs/xfs_fsops.c @@ -634,7 +634,7 @@ xfs_fs_goingdown( if (sb && !IS_ERR(sb)) { xfs_force_shutdown(mp, SHUTDOWN_FORCE_UMOUNT); - thaw_bdev(sb->s_bdev, sb); + thaw_bdev(sb->s_bdev, sb, 0); } break; Index: linux-2.6/include/linux/buffer_head.h =================================================================== --- linux-2.6.orig/include/linux/buffer_head.h +++ linux-2.6/include/linux/buffer_head.h @@ -171,7 +171,8 @@ void __wait_on_buffer(struct buffer_head wait_queue_head_t *bh_waitq_head(struct buffer_head *bh); int fsync_bdev(struct block_device *); struct super_block *freeze_bdev(struct block_device *); -int thaw_bdev(struct block_device *, struct super_block *); +void emergency_thaw(void); +int thaw_bdev(struct block_device *, struct super_block *, int); int fsync_super(struct super_block *); int fsync_no_super(struct block_device *); struct buffer_head *__find_get_block(struct block_device *bdev, sector_t block, From SRS0+5c86b1530a7ce9708fc1+1958+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 2 03:47:43 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n029lgBr015644 for ; Fri, 2 Jan 2009 03:47:43 -0600 X-ASG-Debug-ID: 1230889661-642802750000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DCB7D58FF9 for ; Fri, 2 Jan 2009 01:47:41 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 4DvlLkuf72wLghu1 for ; Fri, 02 Jan 2009 01:47:41 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LIgcs-0005HD-9x; Fri, 02 Jan 2009 09:47:30 +0000 Date: Fri, 2 Jan 2009 04:47:30 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: Takashi Sato , Andrew Morton , Christoph Hellwig , "linux-fsdevel@vger.kernel.org" , "dm-devel@redhat.com" , "viro@ZenIV.linux.org.uk" , "linux-ext4@vger.kernel.org" , "xfs@oss.sgi.com" , "mtk.manpages@googlemail.com" , "axboe@kernel.dk" , "linux-kernel@vger.kernel.org" X-ASG-Orig-Subj: Re: [PATCH 0/3] freeze feature ver 1.14 Subject: Re: [PATCH 0/3] freeze feature ver 1.14 Message-ID: <20090102094730.GA17841@infradead.org> References: <20081027215811t-sato@mail.jp.nec.com> <495DA488.7080702@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <495DA488.7080702@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-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: 1230889661 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com On Thu, Jan 01, 2009 at 11:22:16PM -0600, Eric Sandeen wrote: > In lieu of the timeout feature which was originally proposed, how > about access to an emergency un-freeze via magic sysrq, maybe > piggy-backed on emergency sync... something like this (not > tested or even built yet...), would this be a good compromise to > help save people from frozen roots? Looks sane to me. But for that we'd need to get the generic freeze bits in first. Andrews, as they are in 2.6.28-rc2 do you plan to send them? Any chance for a general -mm merge plan, btw? From geert@linux-m68k.org Fri Jan 2 03:58:20 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n029wJCI016566 for ; Fri, 2 Jan 2009 03:58:20 -0600 X-ASG-Debug-ID: 1230890297-531202010000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from wilson.telenet-ops.be (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A7AFB1BF92DB for ; Fri, 2 Jan 2009 01:58:17 -0800 (PST) Received: from wilson.telenet-ops.be (wilson.telenet-ops.be [195.130.132.42]) by cuda.sgi.com with ESMTP id JyIGrBEzYCbQViKw for ; Fri, 02 Jan 2009 01:58:17 -0800 (PST) Received: from localhost (localhost.localdomain [127.0.0.1]) by wilson.telenet-ops.be (Postfix) with SMTP id 5B14134051; Fri, 2 Jan 2009 10:57:45 +0100 (CET) Received: from anakin.of.borg (d54C15368.access.telenet.be [84.193.83.104]) by wilson.telenet-ops.be (Postfix) with ESMTP id DB61934050; Fri, 2 Jan 2009 10:57:44 +0100 (CET) Received: from anakin.of.borg (localhost [127.0.0.1]) by anakin.of.borg (8.14.3/8.14.3/Debian-5) with ESMTP id n029viZ6023970 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT); Fri, 2 Jan 2009 10:57:44 +0100 Received: from localhost (geert@localhost) by anakin.of.borg (8.14.3/8.14.3/Submit) with ESMTP id n029vhho023967; Fri, 2 Jan 2009 10:57:43 +0100 X-Authentication-Warning: anakin.of.borg: geert owned process doing -bs Date: Fri, 2 Jan 2009 10:57:43 +0100 (CET) From: Geert Uytterhoeven Sender: geert@linux-m68k.org To: Christoph Hellwig cc: Lachlan McIlroy , Linus Torvalds , Linux Kernel Development , xfs@oss.sgi.com, Andrew Morton X-ASG-Orig-Subj: Re: [GIT PULL] XFS update for 2.6.29 Subject: Re: [GIT PULL] XFS update for 2.6.29 In-Reply-To: <20090101170329.GA17892@infradead.org> Message-ID: References: <20081230030845.A4F0558AE206@chook.melbourne.sgi.com> <20090101170329.GA17892@infradead.org> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Barracuda-Connect: wilson.telenet-ops.be[195.130.132.42] X-Barracuda-Start-Time: 1230890298 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14223 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, 1 Jan 2009, Christoph Hellwig wrote: > On Thu, Jan 01, 2009 at 10:50:52AM +0100, Geert Uytterhoeven wrote: > > | fs/xfs/xfs_btree.c: In function 'xfs_btree_readahead_lblock': > > | fs/xfs/xfs_btree.c:736: warning: comparison is always true due to limited range of data type > > | fs/xfs/xfs_btree.c:741: warning: comparison is always true due to limited range of data type > > > > left/right = xfs_fsblock_t (32 or 64 bit), NULLDFSBNO = xfs_dfsbno_t (64 bit) > > Hmm, can't reproduce it here with CONFIG_LBD=n on x86, but the following x86-32 or -64? It may also depend on the compiler version. I have gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21). > patch should fix it: Yep, the warning is good. Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds From SRS0+5c86b1530a7ce9708fc1+1958+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 2 03:58:44 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n029wiDc016600 for ; Fri, 2 Jan 2009 03:58:44 -0600 X-ASG-Debug-ID: 1230890323-643202fd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 67D7E5960C; Fri, 2 Jan 2009 01:58:43 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id JtWycC5nDD5cUm4U; Fri, 02 Jan 2009 01:58:43 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LIgni-0006Q9-Of; Fri, 02 Jan 2009 09:58:42 +0000 Date: Fri, 2 Jan 2009 04:58:42 -0500 From: Christoph Hellwig To: Geert Uytterhoeven Cc: Christoph Hellwig , Lachlan McIlroy , Linus Torvalds , Linux Kernel Development , xfs@oss.sgi.com, Andrew Morton X-ASG-Orig-Subj: Re: [GIT PULL] XFS update for 2.6.29 Subject: Re: [GIT PULL] XFS update for 2.6.29 Message-ID: <20090102095842.GA24652@infradead.org> References: <20081230030845.A4F0558AE206@chook.melbourne.sgi.com> <20090101170329.GA17892@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.18 (2008-05-17) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[18.85.46.34] X-Barracuda-Start-Time: 1230890323 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com On Fri, Jan 02, 2009 at 10:57:43AM +0100, Geert Uytterhoeven wrote: > > Hmm, can't reproduce it here with CONFIG_LBD=n on x86, but the following > > x86-32 or -64? > > It may also depend on the compiler version. I have gcc version 4.1.2 20061115 > (prerelease) (Debian 4.1.1-21). 32 bit, gcc version 4.3.2 (Debian 4.3.2-1) From cw@f00f.org Fri Jan 2 04:03:10 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n02A39bi016919 for ; Fri, 2 Jan 2009 04:03:10 -0600 X-ASG-Debug-ID: 1230890588-642803060000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from parsec.stupidest.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 76B9D59390 for ; Fri, 2 Jan 2009 02:03:08 -0800 (PST) Received: from parsec.stupidest.org (splinter.f00f.org [216.75.21.205]) by cuda.sgi.com with ESMTP id Z1OJhZ17qxE6vcz9 for ; Fri, 02 Jan 2009 02:03:08 -0800 (PST) Received: from stupidest.org (unknown [10.0.1.1]) by parsec.stupidest.org (Postfix) with ESMTP id 25B74AEFA4 for ; Fri, 2 Jan 2009 02:03:07 -0800 (PST) Received: by tuatara.stupidest.org (Postfix, from userid 10000) id 443E42849A41; Fri, 2 Jan 2009 02:03:06 -0800 (PST) Date: Fri, 2 Jan 2009 02:03:06 -0800 From: Chris Wedgwood To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] fix xfs_fsr insufficient space check Subject: [PATCH] fix xfs_fsr insufficient space check Message-ID: <20090102100306.GA36830@puku.stupidest.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Barracuda-Connect: splinter.f00f.org[216.75.21.205] X-Barracuda-Start-Time: 1230890588 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14223 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The xfs_fsr insufficient check should consider the blocks used not the file length. Without this change it is not possible to reorganize sparse files when file size exceeds the free space. Signed-off-by: Chris Wedgwood --- fsr/xfs_fsr.c.orig 2009-01-02 01:51:03.049181411 -0800 +++ fsr/xfs_fsr.c 2009-01-02 01:53:56.297180891 -0800 @@ -912,9 +912,9 @@ } bsize = vfss.f_frsize ? vfss.f_frsize : vfss.f_bsize; - if (statp->bs_size > ((vfss.f_bfree * bsize) - minimumfree)) { + if ((statp->bs_blksize * statp->bs_blocks) > ((vfss.f_bfree * bsize) - minimumfree)) { fsrprintf(_("insufficient freespace for: %s: " - "size=%lld: ignoring\n"), fname, statp->bs_size); + "size=%lld: ignoring\n"), fname, statp->bs_blksize * statp->bs_blocks); return 1; } From SRS0+5c86b1530a7ce9708fc1+1958+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 2 06:00:04 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n02C02EN026005 for ; Fri, 2 Jan 2009 06:00:04 -0600 X-ASG-Debug-ID: 1230897601-45d300db0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D09E11BF94EA for ; Fri, 2 Jan 2009 04:00:01 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Vju4kkI2DFbc8SQH for ; Fri, 02 Jan 2009 04:00:01 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LIih6-00037P-K2; Fri, 02 Jan 2009 12:00:00 +0000 Date: Fri, 2 Jan 2009 07:00:00 -0500 From: Christoph Hellwig To: Chris Wedgwood Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] fix xfs_fsr insufficient space check Subject: Re: [PATCH] fix xfs_fsr insufficient space check Message-ID: <20090102120000.GA9789@infradead.org> References: <20090102100306.GA36830@puku.stupidest.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090102100306.GA36830@puku.stupidest.org> User-Agent: Mutt/1.5.18 (2008-05-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: 1230897601 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com On Fri, Jan 02, 2009 at 02:03:06AM -0800, Chris Wedgwood wrote: > The xfs_fsr insufficient check should consider the blocks used not the > file length. Without this change it is not possible to reorganize > sparse files when file size exceeds the free space. > > Signed-off-by: Chris Wedgwood > > > --- fsr/xfs_fsr.c.orig 2009-01-02 01:51:03.049181411 -0800 > +++ fsr/xfs_fsr.c 2009-01-02 01:53:56.297180891 -0800 > @@ -912,9 +912,9 @@ > } > bsize = vfss.f_frsize ? vfss.f_frsize : vfss.f_bsize; > > - if (statp->bs_size > ((vfss.f_bfree * bsize) - minimumfree)) { > + if ((statp->bs_blksize * statp->bs_blocks) > ((vfss.f_bfree * bsize) - minimumfree)) { I'll put this after fixing the line length and removing all the superflous braces. Also we probably want a comment that bs_blksize in xfs_bstat_t actually is the blocksize, unlike st_blksize in struct stat. From www-data@hiphop-magazine.com Fri Jan 2 10:09:12 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.1 required=5.0 tests=AWL,BAYES_50,HTML_MESSAGE autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n02G9BRu010351 for ; Fri, 2 Jan 2009 10:09:12 -0600 X-ASG-Debug-ID: 1230912546-794602c00000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from hiphop-magazine.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3A5175A0A4 for ; Fri, 2 Jan 2009 08:09:06 -0800 (PST) Received: from hiphop-magazine.com (hiphop-magazine.com [85.214.133.137]) by cuda.sgi.com with ESMTP id sQHxlMEObxuAAI3r for ; Fri, 02 Jan 2009 08:09:06 -0800 (PST) Received: by hiphop-magazine.com (Postfix, from userid 33) id 4C3EC4B85BA; Fri, 2 Jan 2009 17:08:33 +0100 (CET) To: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: Yo! PR: Coast 2 Coast Mixtape Vol. 62 - Hosted By Swizz Beatz Subject: Yo! PR: Coast 2 Coast Mixtape Vol. 62 - Hosted By Swizz Beatz Date: Fri, 2 Jan 2009 17:08:33 +0100 From: Yo! Raps Reply-To: Yo! Raps Message-ID: X-Priority: 3 X-Mailer: PHPMailer [version 1.73] X-ListMessenger-Version: Pro [2.1.0] X-ListMessenger-ID: X-Originating-IP: 91.3.159.21 List-Help: List-Owner: (Yo! Raps) List-Unsubscribe: List-Archive: List-Post: NO MIME-Version: 1.0 X-Barracuda-Connect: hiphop-magazine.com[85.214.133.137] X-Barracuda-Start-Time: 1230912548 X-Barracuda-Bayes: INNOCENT GLOBAL 0.6526 1.0000 1.0380 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.24 X-Barracuda-Spam-Status: No, SCORE=1.24 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA074b, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14244 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.20 BSF_SC0_SA074b URI: Custom Rule SA074b 0.00 HTML_MESSAGE BODY: HTML included in message Content-Type: text/plain Content-Disposition: inline Content-Transfer-Encoding: 7bit Content-length: 2498 Please contact me if you place any of the following information on your site, or to request an interview. Thank you for your time! COAST 2 COAST MIXTAPE VOL. 62 - HOSTED BY SWIZZ BEATZ Lil Fats presents Coast 2 Coast Mixtape Vol. 62, hosted by Swizz Beatz. This mixtape features new music from the whole industry including Jadakiss, Fat Joe, Jay Rock, Papoose, Joell Ortiz, and more. It also features exclusive freestyles from Sha Stimuli, Reks, Lil Fats, St. Laz, Cy Marshall Law and more! Artists: Submit your music for the next mixtape at www.coast2coastsubmissions.com DOWNLOAD THIS MIXTAPE FOR FREE NOW AT: www.coast2coastmixtapes.com TRACKLIST 1. Swizz Beatz - Let It Loose 2. Sha Stimuli - Coast 2 Coast Weekly 7 3. Jay Rock. ft. Papoose, Grafh, Joell Ortiz, Stacy Adams & K. Dot - East Meets West 4. Jadakiss - Letter To BIG 5. Reks - Coast 2 Coast Weekly 3 6. Fat Joe ft. Ron Browz & Lil Wayne - Winding On Me 7. Swizz Beatz - Way You Make Me Feel 8. Lil Fats - Coast 2 Coast Weekly 19 9. Lloyd Banks - My Brothers Keeper 10. St. Laz - Coast 2 Coast Weekly 2 11. Stat Quo - The Wind 12. Cy Marshall Law - Coast 2 Coast Weekly 3 13. LieFocals - Hood Star 14. J-LP ft. Ray J - Rush 15. Supa - Know Dat 16. T.O.B.I.A.S - Bumper 2 Bumper 17. Cartel Enterprise (Phame, Money, Jdot & AK) - Lime Green 18. Broadway - Bezzel 19. Maluv - Only You 20. DJ Suarez ft. JT The Bigga Figga - DJ Suarez (Freestyle) 21. Marc Menace - Stay Up 22. E. Gamble - Jump Off Chick 23. J-Sin ft. Showtime & AK of Do Or Die - Bottles Up 24. David $tarr (D. $tizzy) - So Emotional (Remix) 25. Codyac - Words Cant Describe 26. Johnny Toma - Greazy 27. The UnNaturalists - Tip Top 28. Travisty - All Talk 29. Swizz Beatz - Outro WEBSITE: http://www.coast2coastmixtapes.com CONTACT: Lil Fats | coast2coastmixtapes@gmail.com Let your song, video, mixtape, press release serviced up to 1,200,000 industry contacts including Label Execs, A&R's, Radio Stations, Record Breakers, Record Pools, Magazines, Major Websites, Promoters, Artists, Consumers, Managers, Publicists! Email: info@yo-pr.com ------------------------------------------------------------------- This e-mail was sent to linux-xfs@oss.sgi.com because you are subscribed to at least one of our mailing lists. If at any time you would like to remove yourself from our mailing list, please feel free to do so by visiting: http://www.yoraps.com/mailinglist/public/unsubscribe.php?g=6&addr=linux-xfs@oss.sgi.com [[HTML alternate version deleted]] From www-data@hiphop-magazine.com Fri Jan 2 10:55:13 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=BAYES_50 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n02Gt9gj014024 for ; Fri, 2 Jan 2009 10:55:13 -0600 X-ASG-Debug-ID: 1230915307-5c2a002d0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from hiphop-magazine.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 798D35A2C7 for ; Fri, 2 Jan 2009 08:55:07 -0800 (PST) Received: from hiphop-magazine.com (hiphop-magazine.com [85.214.133.137]) by cuda.sgi.com with ESMTP id LEdSIB2o8ZFVRaZg for ; Fri, 02 Jan 2009 08:55:07 -0800 (PST) Received: by hiphop-magazine.com (Postfix, from userid 33) id 617A7499D34; Fri, 2 Jan 2009 17:51:45 +0100 (CET) To: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: Mailing List Removal Confirmation Notice Subject: Mailing List Removal Confirmation Notice Date: Fri, 2 Jan 2009 17:51:45 +0100 From: Yo! Raps Reply-To: Yo! Raps Message-ID: <3bfd99ec166347448d4cb86d174081a9@www.yoraps.com> X-Priority: 3 X-Mailer: PHPMailer [version 1.73] X-ListMessenger-Version: Pro [2.1.0] X-ListMessenger-ID: X-Originating-IP: 62.4.18.94 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="ISO-8859-1" X-Barracuda-Connect: hiphop-magazine.com[85.214.133.137] X-Barracuda-Start-Time: 1230915308 X-Barracuda-Bayes: INNOCENT GLOBAL 0.5000 1.0000 0.7500 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.75 X-Barracuda-Spam-Status: No, SCORE=0.75 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14247 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Someone (either yourself or the list administrator) has requested that your e-mail address be removed from one or more of our mailing lists. This e-mail is being sent to confirm that you wish to be removed from our system. If you would like to opt-out, please follow the link below: http://www.yoraps.com/mailinglist/public/confirm.php?id=1232650&code=a7f397d521cce1536e17ccc9955aa56a If you did not request to be removed from our mailing lists, please ignore this e-mail and do not follow the above link. If requests persist, you may wish to notify our abuse account at no-reply@yoraps.com. Sincerely, Yo! Raps From SRS0+5c86b1530a7ce9708fc1+1958+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 2 11:59:13 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n02HxCv1018581 for ; Fri, 2 Jan 2009 11:59:13 -0600 X-ASG-Debug-ID: 1230919151-58aa01230000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 026CD1BFA410 for ; Fri, 2 Jan 2009 09:59:11 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 84kPTlsjFuVFFKPN for ; Fri, 02 Jan 2009 09:59:11 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LIoIh-0007hU-N9; Fri, 02 Jan 2009 17:59:11 +0000 Date: Fri, 2 Jan 2009 12:59:11 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss X-ASG-Orig-Subj: Re: oopses in xfs_attr_shortform_* on kerneloops.org Subject: Re: oopses in xfs_attr_shortform_* on kerneloops.org Message-ID: <20090102175911.GA29506@infradead.org> References: <495D91A0.4050304@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <495D91A0.4050304@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-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: 1230919152 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com On Thu, Jan 01, 2009 at 10:01:36PM -0600, Eric Sandeen wrote: > I noticed this on kerneloops.org and pinged Christoph about it but I'll > go ahead & point it out here & file a bug so it doesn't get lost: > > http://www.kerneloops.org/search.php?search=xfs_attr_shortform&btnG=Function+Search > > would seem to indicate a problem, though not a (recent) regression anyway. Yeah, I've been looking into and the disassemly looks like we have a NULL attribut fork pointer for some reason. I did some poking around in the code and couldn't a cause for it. So if anyone of the kerneloops submitters actually is on the list and can reproduce it that would be extremly helpful. From SRS0+5c86b1530a7ce9708fc1+1958+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 2 12:00:00 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n02HxxGN018677 for ; Fri, 2 Jan 2009 12:00:00 -0600 X-ASG-Debug-ID: 1230919198-58d901340000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6B68F1BFA1AD for ; Fri, 2 Jan 2009 09:59:58 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 2X0LAljXDDIpgaRn for ; Fri, 02 Jan 2009 09:59:58 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LIoJS-0007iz-5A; Fri, 02 Jan 2009 17:59:58 +0000 Date: Fri, 2 Jan 2009 12:59:58 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss X-ASG-Orig-Subj: Re: [PATCH] remove always-true #ifndef HAVE_FORMAT32 tests Subject: Re: [PATCH] remove always-true #ifndef HAVE_FORMAT32 tests Message-ID: <20090102175958.GB29506@infradead.org> References: <495D48B3.2080708@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <495D48B3.2080708@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-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: 1230919198 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com On Thu, Jan 01, 2009 at 04:50:27PM -0600, Eric Sandeen wrote: > There are several tests for #ifndef HAVE_FORMAT32, but > this is never defined anywhere so it is always the default > behavior; just remove the ifndef goop. Looks good to me. I can't see any reason why you'd want to defined these in a different place. From SRS0+5c86b1530a7ce9708fc1+1958+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 2 12:02:50 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n02I2ntG019019 for ; Fri, 2 Jan 2009 12:02:50 -0600 X-ASG-Debug-ID: 1230919368-58e4012b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 65E841BFA1EE for ; Fri, 2 Jan 2009 10:02:48 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id mAy8SjPFogXXzh54 for ; Fri, 02 Jan 2009 10:02:48 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LIoMB-0008Bv-GW; Fri, 02 Jan 2009 18:02:48 +0000 Date: Fri, 2 Jan 2009 13:02:47 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss X-ASG-Orig-Subj: Re: [PATCH] create xfstests install target Subject: Re: [PATCH] create xfstests install target Message-ID: <20090102180247.GC29506@infradead.org> References: <495D42CE.6060806@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <495D42CE.6060806@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-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: 1230919368 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com On Thu, Jan 01, 2009 at 04:25:18PM -0600, Eric Sandeen wrote: > Not sure what the best location for this is in the end, but that's > just a one-line change in builddefs.in if it should move. Currently > it goes to whatever configure thinks "libexecdir" is. I think that's incorrect. libexecdir is /usr/lib for FHS or /usr/libexec for BSDish filesystem layouts, but /use should be read-only mountable. Maybe /var/lib/xfstests as a start? That seems to be the dumping ground for random stuff that needs write access. Even better would be keeping the scripts under /usr/lib and the output in /var/lib, but that might be too much work. > +PKG_SBIN_DIR = @sbindir@ This one doesn't actually seem to be used. Otherwise looks good to me. From SRS0+5c86b1530a7ce9708fc1+1958+infradead.org+hch@bombadil.srs.infradead.org Fri Jan 2 12:03:53 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n02I3qvL019163 for ; Fri, 2 Jan 2009 12:03:53 -0600 X-ASG-Debug-ID: 1230919431-58a601490000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A17BB1BFA1F9 for ; Fri, 2 Jan 2009 10:03:51 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id eivplr97bIU4HsLK for ; Fri, 02 Jan 2009 10:03:51 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LIoMi-0008Cy-Qx; Fri, 02 Jan 2009 18:03:20 +0000 Date: Fri, 2 Jan 2009 13:03:20 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss X-ASG-Orig-Subj: Re: [PATCH] xfstests Makepkgs framework, builds rpms Subject: Re: [PATCH] xfstests Makepkgs framework, builds rpms Message-ID: <20090102180320.GD29506@infradead.org> References: <495D42CE.6060806@sandeen.net> <495D8E64.5070206@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <495D8E64.5070206@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-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: 1230919431 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com On Thu, Jan 01, 2009 at 09:47:48PM -0600, Eric Sandeen wrote: > With the install target in place, this lets us do Makepkgs: > > == dist, log is Logs/dist > Wrote: /root/src/xfstests-dev.work/build/xfstests-1.0.0.src.tar.gz > Wrote: /root/src/xfstests-dev.work/build/tar/xfstests-1.0.0.tar.gz > Wrote: /root/src/xfstests-dev.work/build/rpm/xfstests-1.0.0-1.src.rpm > Wrote: /root/src/xfstests-dev.work/build/rpm/xfstests-1.0.0-1.x86_64.rpm > > It's all largely cut & pasted from the xfsprogs framework. > I'll let the debian elves do the things they do for debian > packaging if they're interested... > > xfstests could use more work to make it package-friendly but this > is a good start at least. You missed the Debian packaging :) I'll give it a try. From sandeen@sandeen.net Fri Jan 2 12:26:25 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n02IQPJq021093 for ; Fri, 2 Jan 2009 12:26:25 -0600 X-ASG-Debug-ID: 1230920783-5c0101190000-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 0C9FF5A528 for ; Fri, 2 Jan 2009 10:26:23 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id Jt1qVstZD6xFBt9E for ; Fri, 02 Jan 2009 10:26:23 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 1E74AA9FEA6; Fri, 2 Jan 2009 12:26:21 -0600 (CST) Message-ID: <495E5C4D.80307@sandeen.net> Date: Fri, 02 Jan 2009 12:26:21 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.19 (Macintosh/20081209) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs-oss X-ASG-Orig-Subj: Re: [PATCH] create xfstests install target Subject: Re: [PATCH] create xfstests install target References: <495D42CE.6060806@sandeen.net> <20090102180247.GC29506@infradead.org> In-Reply-To: <20090102180247.GC29506@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1230920784 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14252 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Christoph Hellwig wrote: > On Thu, Jan 01, 2009 at 04:25:18PM -0600, Eric Sandeen wrote: >> Not sure what the best location for this is in the end, but that's >> just a one-line change in builddefs.in if it should move. Currently >> it goes to whatever configure thinks "libexecdir" is. > > I think that's incorrect. libexecdir is /usr/lib for FHS or /usr/libexec > for BSDish filesystem layouts, but /use should be read-only mountable. > > Maybe /var/lib/xfstests as a start? That seems to be the dumping ground > for random stuff that needs write access. Ok, easy enough. > Even better would be keeping > the scripts under /usr/lib and the output in /var/lib, but that might > be too much work. Yeah at least right now I'm not that highly motivated. :) >> +PKG_SBIN_DIR = @sbindir@ > > This one doesn't actually seem to be used. true, it's not ... I put it in there thinking about putting a wrapper in sbin or /usr/sbin so tests could be launched from root's path ... -Eric > Otherwise looks good to me. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From mikesm559@yahoo.com Fri Jan 2 12:36:39 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n02IabgY021743 for ; Fri, 2 Jan 2009 12:36:39 -0600 X-ASG-Debug-ID: 1230921395-58aa01cd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from web30802.mail.mud.yahoo.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id CDE0B1BFA36F for ; Fri, 2 Jan 2009 10:36:35 -0800 (PST) Received: from web30802.mail.mud.yahoo.com (web30802.mail.mud.yahoo.com [68.142.200.145]) by cuda.sgi.com with SMTP id YxQdfmq63OGW50K4 for ; Fri, 02 Jan 2009 10:36:35 -0800 (PST) Received: (qmail 49758 invoked by uid 60001); 2 Jan 2009 18:36:34 -0000 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; h=X-YMail-OSG:Received:X-Mailer:Date:From:Subject:To:MIME-Version:Content-Type:Message-ID; b=jDsUi7kkg4ALemKWOeJEFxP0j2VkcbhLIfZuxg72JYx5UUmpy0fTz2vofRF5pmh2xdBFqlqYCE51giwLMUUV/KyENR2RjIOjdqMnQbNzcadl0gVEf1Df+97XUO7RfuEoIaBYzyFlXrdWLUMdfFQEOhZytOgXbF4mSTzJOtfhR10=; X-YMail-OSG: NkedHNAVM1kA7lxU1EQRL3gAE9_R30M3UyqQD5RYaN38xvtP2xIUosC2mBHkeICbnaSS9i06TAEORaP6zblqoUxLakgWHuUPcb8DFtP.NkOq3OO9Pd5IxTE19Y86XqCMoke1.QVB7ngDT9BDkS_L5gN40gni9CzHWy60gk0U4kGxZbQAL2RUZYJjHihW6Q-- Received: from [24.5.6.84] by web30802.mail.mud.yahoo.com via HTTP; Fri, 02 Jan 2009 10:36:34 PST X-Mailer: YahooMailRC/1155.45 YahooMailWebService/0.7.260.1 Date: Fri, 2 Jan 2009 10:36:34 -0800 (PST) From: Mike Myers X-ASG-Orig-Subj: Recovering XFS data froma RAID failure Subject: Recovering XFS data froma RAID failure To: xfs@oss.sgi.com MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Message-ID: <703541.49128.qm@web30802.mail.mud.yahoo.com> X-Barracuda-Connect: web30802.mail.mud.yahoo.com[68.142.200.145] X-Barracuda-Start-Time: 1230921396 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14252 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hello everyone. I seem to have run into a spate of bad luck on New Year's day morning, and would love some assistance. I have (had) a 12 TB XFS filesystem running on top of a single LVM volume running on top of 2 7 TB software RAID5 sets (this is under opensuse 11.0). One of the RAID5 sets suffered a disk fault that had it go into degraded mode, and then suffered another disk fault while trying to restripe a new disk and a hardware SATA controller fault that occured all at the same time. Yes, I know the odds of this happening, and I am trying to discern what grevious sin I have committed to warrant this sort of treament. I don't even work on Wall Street! Anyways, I have a new SATA controller online and the disks are now talking to the system again, and I am working hard to try and salvage the array, but it looks pretty likely that RAID set may not be recoverable. About 9 TB of data was present in the XFS volume, and the 2nd 7 TB RAID5 volume is working just fine. I was wondering if there was any way to salvage data from the XFS volume so that any files who are intact on the half of the volume that is still there could be recovered? I'm not trying to get back data that was rm'd, but if I can't recover one of the RAID5 volumes, it would be good to try and pull things off whatever is left. Any ideas for me? Thx mike From sandeen@sandeen.net Fri Jan 2 21:47:02 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n033l1of027188 for ; Fri, 2 Jan 2009 21:47:02 -0600 X-ASG-Debug-ID: 1230954420-3e8300350000-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 026525BCE7 for ; Fri, 2 Jan 2009 19:47:00 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id O1Wwsu4jKuEFjGeo for ; Fri, 02 Jan 2009 19:47:00 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 09759AABFCD; Fri, 2 Jan 2009 21:46:59 -0600 (CST) Message-ID: <495EDFB2.30603@sandeen.net> Date: Fri, 02 Jan 2009 21:46:58 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.19 (Macintosh/20081209) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs-oss X-ASG-Orig-Subj: Re: [PATCH] create xfstests install target Subject: Re: [PATCH] create xfstests install target References: <495D42CE.6060806@sandeen.net> <20090102180247.GC29506@infradead.org> <495E5C4D.80307@sandeen.net> In-Reply-To: <495E5C4D.80307@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1230954421 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14285 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Eric Sandeen wrote: > Christoph Hellwig wrote: >> On Thu, Jan 01, 2009 at 04:25:18PM -0600, Eric Sandeen wrote: >>> Not sure what the best location for this is in the end, but that's >>> just a one-line change in builddefs.in if it should move. Currently >>> it goes to whatever configure thinks "libexecdir" is. >> I think that's incorrect. libexecdir is /usr/lib for FHS or /usr/libexec >> for BSDish filesystem layouts, but /use should be read-only mountable. >> >> Maybe /var/lib/xfstests as a start? That seems to be the dumping ground >> for random stuff that needs write access. > > Ok, easy enough. Or so one might think. Anyone good with autoconf who can tell me how the *!@% to specify /var/lib ? -Eric From sandeen@sandeen.net Fri Jan 2 22:09:37 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n0349bxs028615 for ; Fri, 2 Jan 2009 22:09:37 -0600 X-ASG-Debug-ID: 1230955774-538803040000-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 90D23175A868 for ; Fri, 2 Jan 2009 20:09:34 -0800 (PST) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id 9A26RJwCzaH73DZP for ; Fri, 02 Jan 2009 20:09:34 -0800 (PST) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id B014AA9FEA3; Fri, 2 Jan 2009 22:09:32 -0600 (CST) Message-ID: <495EE4FC.9080808@sandeen.net> Date: Fri, 02 Jan 2009 22:09:32 -0600 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.19 (Macintosh/20081209) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs-oss X-ASG-Orig-Subj: Re: oopses in xfs_attr_shortform_* on kerneloops.org Subject: Re: oopses in xfs_attr_shortform_* on kerneloops.org References: <495D91A0.4050304@sandeen.net> <20090102175911.GA29506@infradead.org> In-Reply-To: <20090102175911.GA29506@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1230955775 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14287 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Christoph Hellwig wrote: > On Thu, Jan 01, 2009 at 10:01:36PM -0600, Eric Sandeen wrote: >> I noticed this on kerneloops.org and pinged Christoph about it but I'll >> go ahead & point it out here & file a bug so it doesn't get lost: >> >> http://www.kerneloops.org/search.php?search=xfs_attr_shortform&btnG=Function+Search >> >> would seem to indicate a problem, though not a (recent) regression anyway. > > Yeah, I've been looking into and the disassemly looks like we have > a NULL attribut fork pointer for some reason. I did some poking > around in the code and couldn't a cause for it. So if anyone of > the kerneloops submitters actually is on the list and can reproduce > it that would be extremly helpful. This *might* be a clue: http://article.gmane.org/gmane.comp.file-systems.xfs.general/22156 one of those oopses, and associated xfs_repair output for the fs in question... doesn't make anything clearer to me, though, offhand. -Eric From SRS0+b0071679477698ef99e8+1959+infradead.org+hch@bombadil.srs.infradead.org Sat Jan 3 14:52:29 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n03KqSMC002479 for ; Sat, 3 Jan 2009 14:52:29 -0600 X-ASG-Debug-ID: 1231015948-53d603560000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6AF565CA86 for ; Sat, 3 Jan 2009 12:52:28 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id UKRHZQL1ETVjOjb5 for ; Sat, 03 Jan 2009 12:52:28 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LJDTv-0005Jj-T6 for xfs@oss.sgi.com; Sat, 03 Jan 2009 20:52:27 +0000 Date: Sat, 3 Jan 2009 15:52:27 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] fix bad_features2 fixups for the root filesystem Subject: [PATCH] fix bad_features2 fixups for the root filesystem Message-ID: <20090103205227.GA20346@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-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: 1231015948 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com Currently the bad_features2 fixup and the alignment updates in the superblock are skipped if we mount a filesystem read-only. But for the root filesystem the typical case is to mount read-only first and only later remount writeable so we'll never perform this update at all. It's not a big problem but means the logs of people needing the fixup get spammed at every boot because they never happen on disk. Reported-by: Arkadiusz Miskiewicz Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_mount.c =================================================================== --- xfs.orig/fs/xfs/xfs_mount.c 2009-01-02 18:39:11.579671462 +0100 +++ xfs/fs/xfs/xfs_mount.c 2009-01-03 21:42:36.741548942 +0100 @@ -45,7 +45,6 @@ #include "xfs_fsops.h" #include "xfs_utils.h" -STATIC int xfs_mount_log_sb(xfs_mount_t *, __int64_t); STATIC int xfs_uuid_mount(xfs_mount_t *); STATIC void xfs_unmountfs_wait(xfs_mount_t *); @@ -682,7 +681,7 @@ xfs_initialize_perag_data(xfs_mount_t *m * Update alignment values based on mount options and sb values */ STATIC int -xfs_update_alignment(xfs_mount_t *mp, __uint64_t *update_flags) +xfs_update_alignment(xfs_mount_t *mp) { xfs_sb_t *sbp = &(mp->m_sb); @@ -736,11 +735,11 @@ xfs_update_alignment(xfs_mount_t *mp, __ if (xfs_sb_version_hasdalign(sbp)) { if (sbp->sb_unit != mp->m_dalign) { sbp->sb_unit = mp->m_dalign; - *update_flags |= XFS_SB_UNIT; + mp->m_update_flags |= XFS_SB_UNIT; } if (sbp->sb_width != mp->m_swidth) { sbp->sb_width = mp->m_swidth; - *update_flags |= XFS_SB_WIDTH; + mp->m_update_flags |= XFS_SB_WIDTH; } } } else if ((mp->m_flags & XFS_MOUNT_NOALIGN) != XFS_MOUNT_NOALIGN && @@ -905,7 +904,6 @@ xfs_mountfs( xfs_sb_t *sbp = &(mp->m_sb); xfs_inode_t *rip; __uint64_t resblks; - __int64_t update_flags = 0LL; uint quotamount, quotaflags; int uuid_mounted = 0; int error = 0; @@ -933,7 +931,7 @@ xfs_mountfs( "XFS: correcting sb_features alignment problem"); sbp->sb_features2 |= sbp->sb_bad_features2; sbp->sb_bad_features2 = sbp->sb_features2; - update_flags |= XFS_SB_FEATURES2 | XFS_SB_BAD_FEATURES2; + mp->m_update_flags |= XFS_SB_FEATURES2 | XFS_SB_BAD_FEATURES2; /* * Re-check for ATTR2 in case it was found in bad_features2 @@ -947,11 +945,11 @@ xfs_mountfs( if (xfs_sb_version_hasattr2(&mp->m_sb) && (mp->m_flags & XFS_MOUNT_NOATTR2)) { xfs_sb_version_removeattr2(&mp->m_sb); - update_flags |= XFS_SB_FEATURES2; + mp->m_update_flags |= XFS_SB_FEATURES2; /* update sb_versionnum for the clearing of the morebits */ if (!sbp->sb_features2) - update_flags |= XFS_SB_VERSIONNUM; + mp->m_update_flags |= XFS_SB_VERSIONNUM; } /* @@ -960,7 +958,7 @@ xfs_mountfs( * allocator alignment is within an ag, therefore ag has * to be aligned at stripe boundary. */ - error = xfs_update_alignment(mp, &update_flags); + error = xfs_update_alignment(mp); if (error) goto error1; @@ -1137,10 +1135,12 @@ xfs_mountfs( } /* - * If fs is not mounted readonly, then update the superblock changes. + * If this is a read-only mount defer the superblock updates until + * the next remount into writeable mode. Otherwise we would never + * perform the update e.g. for the root filesystem. */ - if (update_flags && !(mp->m_flags & XFS_MOUNT_RDONLY)) { - error = xfs_mount_log_sb(mp, update_flags); + if (mp->m_update_flags && !(mp->m_flags & XFS_MOUNT_RDONLY)) { + error = xfs_mount_log_sb(mp, mp->m_update_flags); if (error) { cmn_err(CE_WARN, "XFS: failed to write sb changes"); goto error4; @@ -1820,7 +1820,7 @@ xfs_uuid_mount( * be altered by the mount options, as well as any potential sb_features2 * fixup. Only the first superblock is updated. */ -STATIC int +int xfs_mount_log_sb( xfs_mount_t *mp, __int64_t fields) Index: xfs/fs/xfs/xfs_mount.h =================================================================== --- xfs.orig/fs/xfs/xfs_mount.h 2009-01-01 11:53:17.541576193 +0100 +++ xfs/fs/xfs/xfs_mount.h 2009-01-03 21:38:22.555577508 +0100 @@ -327,6 +327,8 @@ typedef struct xfs_mount { spinlock_t m_sync_lock; /* work item list lock */ int m_sync_seq; /* sync thread generation no. */ wait_queue_head_t m_wait_single_sync_task; + __int64_t m_update_flags; /* sb flags we need to update + on the next remount,rw */ } xfs_mount_t; /* @@ -514,6 +516,7 @@ extern int xfs_mod_incore_sb_unlocked(xf int64_t, int); extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, uint, int); +extern int xfs_mount_log_sb(xfs_mount_t *, __int64_t); extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); extern int xfs_readsb(xfs_mount_t *, int); extern void xfs_freesb(xfs_mount_t *); Index: xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2009-01-01 11:53:17.294547000 +0100 +++ xfs/fs/xfs/linux-2.6/xfs_super.c 2009-01-03 21:47:58.367578173 +0100 @@ -1197,6 +1197,7 @@ xfs_fs_remount( struct xfs_mount *mp = XFS_M(sb); substring_t args[MAX_OPT_ARGS]; char *p; + int error; while ((p = strsep(&options, ",")) != NULL) { int token; @@ -1247,11 +1248,25 @@ xfs_fs_remount( } } - /* rw/ro -> rw */ + /* ro -> rw */ if ((mp->m_flags & XFS_MOUNT_RDONLY) && !(*flags & MS_RDONLY)) { mp->m_flags &= ~XFS_MOUNT_RDONLY; if (mp->m_flags & XFS_MOUNT_BARRIER) xfs_mountfs_check_barriers(mp); + + /* + * If this is the first remount to writeable state we + * might have some superblock changes to update. + */ + if (mp->m_update_flags) { + error = xfs_mount_log_sb(mp, mp->m_update_flags); + if (error) { + cmn_err(CE_WARN, + "XFS: failed to write sb changes"); + return error; + } + mp->m_update_flags = 0; + } } /* rw -> ro */ From SRS0+b0071679477698ef99e8+1959+infradead.org+hch@bombadil.srs.infradead.org Sat Jan 3 14:53:42 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n03Krg5O002545 for ; Sat, 3 Jan 2009 14:53:42 -0600 X-ASG-Debug-ID: 1231016020-45ce00790000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8A14B17A37EE for ; Sat, 3 Jan 2009 12:53:40 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id EckYTArA4FJ2o1V6 for ; Sat, 03 Jan 2009 12:53:40 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LJDUb-0005Kd-Pd for xfs@oss.sgi.com; Sat, 03 Jan 2009 20:53:09 +0000 Date: Sat, 3 Jan 2009 15:53:09 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfstests: add test 199, bad_features2 correction Subject: [PATCH] xfstests: add test 199, bad_features2 correction Message-ID: <20090103205309.GB20346@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-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: 1231016021 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com Index: xfstests-dev/199 =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xfstests-dev/199 2009-01-03 20:36:06.000000000 +0000 @@ -0,0 +1,65 @@ +#! /bin/sh +# FS QA Test No. 199 +# +# Check that a filesystem first mounted read-only and then remounted +# performs the features2 fixup properly. +# +#----------------------------------------------------------------------- +# Copyright (c) 2008 Christoph Hellwig. +#----------------------------------------------------------------------- +# +# creator +owner=hch@lst.de + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + cd / + umount $SCRATCH_MNT >/dev/null 2>&1 +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch + +_scratch_mkfs_xfs >/dev/null 2>&1 + +# +# Print the current flags. Just a dummy so that the test breaks +# in an obvious way when the default feature flags changed in mkfs +# +echo "Default feature2 flags:" +xfs_db -x $SCRATCH_DEV -c 'sb' -c 'print features2' +xfs_db -x $SCRATCH_DEV -c 'sb' -c 'print bad_features2' + +# +# Now clear the normal flags +# +echo "Clearing features2:" +xfs_db -x $SCRATCH_DEV -c 'sb' -c 'write features2 0' + +# +# And print the flags after a mount ro and remount rw +_scratch_mount -o ro +_scratch_mount -o remount,rw +umount $SCRATCH_MNT +echo "Features 2 after mount ro and remount rw:" +xfs_db -x $SCRATCH_DEV -c 'sb' -c 'print features2' + +# success, all done +echo "*** done" +rm -f $seq.full +status=0 Index: xfstests-dev/group =================================================================== --- xfstests-dev.orig/group 2009-01-03 20:24:09.000000000 +0000 +++ xfstests-dev/group 2009-01-03 20:24:48.000000000 +0000 @@ -300,3 +300,4 @@ 195 ioctl dump auto 196 quota auto 197 dir auto +199 mount auto Index: xfstests-dev/199.out =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xfstests-dev/199.out 2009-01-03 20:46:08.000000000 +0000 @@ -0,0 +1,9 @@ +QA output created by 199 +Default feature2 flags: +features2 = 0x8 +bad_features2 = 0x8 +Clearing features2: +features2 = 0 +Features 2 after mount ro and remount rw: +features2 = 0x8 +*** done From SRS0+b0071679477698ef99e8+1959+infradead.org+hch@bombadil.srs.infradead.org Sat Jan 3 15:45:19 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n03LjIEo006225 for ; Sat, 3 Jan 2009 15:45:19 -0600 X-ASG-Debug-ID: 1231019117-08ae03000000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EFDF55C990 for ; Sat, 3 Jan 2009 13:45:17 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id qh3KSisi6FqvE0HN for ; Sat, 03 Jan 2009 13:45:17 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LJEIV-0002MT-I2; Sat, 03 Jan 2009 21:44:43 +0000 Date: Sat, 3 Jan 2009 16:44:43 -0500 From: Christoph Hellwig To: Nick Piggin Cc: Peter Klotz , Roman Kononov , linux-kernel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: BUG: soft lockup - is this XFS problem? Subject: Re: BUG: soft lockup - is this XFS problem? Message-ID: <20090103214443.GA6612@infradead.org> References: <20081223171259.GA11945@infradead.org> <20081230042333.GC27679@wotan.suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20081230042333.GC27679@wotan.suse.de> User-Agent: Mutt/1.5.18 (2008-05-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: 1231019117 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com On Tue, Dec 30, 2008 at 05:23:33AM +0100, Nick Piggin wrote: > On Tue, Dec 23, 2008 at 12:12:59PM -0500, Christoph Hellwig wrote: > > > > Nick, I've seen various reports like this by Roman. It seems to be > > caused by an interaction of the lockless pagecache with the xfs > > I/O code. Any idea what might be wrong here: > > Hmm, it could get into a loop here if there is a page in the pagecache > with a zero refcount, which might be a problem with XFS... other looping > conditions might indicate a problem iwth lockless pagecache or radix > tree. It would be very helpful to know what condition it is looping on... See http://oss.sgi.com/bugzilla/show_bug.cgi?id=805 From SRS0+c0a58c6b4215c0095039+1960+infradead.org+hch@bombadil.srs.infradead.org Sun Jan 4 10:42:13 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n04GgCVZ016981 for ; Sun, 4 Jan 2009 10:42:13 -0600 X-ASG-Debug-ID: 1231087331-2de102fa0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1D21B5E0D1 for ; Sun, 4 Jan 2009 08:42:12 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id lr8DYrjNUivsTDAB for ; Sun, 04 Jan 2009 08:42:12 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LJW3H-00046U-J9 for xfs@oss.sgi.com; Sun, 04 Jan 2009 16:42:11 +0000 Date: Sun, 4 Jan 2009 11:42:11 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] sanity check attr fork size Subject: [PATCH] sanity check attr fork size Message-ID: <20090104164211.GA15734@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-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: 1231087332 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com Recently we have quite a few kerneloops reports about dereferencing a NULL if_data in the attribute fork. From looking over the code this can only happen if we pass a 0 size argument to xfs_iformat_local. This implies some sort of corruption and in fact the only mailinglist report about this from earlier this year was after a powerfail presumably on a system with write cache and without barriers. Add a quick sanity check for the attr fork size in xfs_iformat to catch these early and without an oops. Signed-off-by: Christoph Hellwig Index: linux-2.6/fs/xfs/xfs_inode.c =================================================================== --- linux-2.6.orig/fs/xfs/xfs_inode.c 2009-01-04 17:35:11.955671640 +0100 +++ linux-2.6/fs/xfs/xfs_inode.c 2009-01-04 17:38:04.643673527 +0100 @@ -424,6 +424,19 @@ xfs_iformat( case XFS_DINODE_FMT_LOCAL: atp = (xfs_attr_shortform_t *)XFS_DFORK_APTR(dip); size = be16_to_cpu(atp->hdr.totsize); + + if (unlikely(size < sizeof(struct xfs_attr_sf_hdr))) { + xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount, + "corrupt inode %Lu " + "(bad attr fork size %Ld).", + (unsigned long long) ip->i_ino, + (long long) size); + XFS_CORRUPTION_ERROR("xfs_iformat(8)", + XFS_ERRLEVEL_LOW, + ip->i_mount, dip); + return XFS_ERROR(EFSCORRUPTED); + } + error = xfs_iformat_local(ip, dip, XFS_ATTR_FORK, size); break; case XFS_DINODE_FMT_EXTENTS: From SRS0+c0a58c6b4215c0095039+1960+infradead.org+hch@bombadil.srs.infradead.org Sun Jan 4 10:48:36 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n04GmaLY017647 for ; Sun, 4 Jan 2009 10:48:36 -0600 X-ASG-Debug-ID: 1231087715-279803aa0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 253175E0EA for ; Sun, 4 Jan 2009 08:48:36 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id J0ksjEDD4CKCQ3SV for ; Sun, 04 Jan 2009 08:48:36 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LJW9T-0004nu-PY; Sun, 04 Jan 2009 16:48:35 +0000 Date: Sun, 4 Jan 2009 11:48:35 -0500 From: Christoph Hellwig To: Eric Sandeen Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH, RFC] xfs_repair: allow filesystems with a single AG Subject: Re: [PATCH, RFC] xfs_repair: allow filesystems with a single AG Message-ID: <20090104164835.GB16133@infradead.org> References: <20081224231901.GA652@infradead.org> <4953C8B8.4010500@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4953C8B8.4010500@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-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: 1231087716 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com On Thu, Dec 25, 2008 at 11:54:00AM -0600, Eric Sandeen wrote: > Christoph Hellwig wrote: > > Currently xfs_repair bails out on a filesystem with just a single AG. > > But that's a perfectly valid configureation, so we should allow it. > > > > Skip the geomery validation because we simply can't do it if we don't > > have a secondary SB, and make sure to take the internal log into account > > when guestimating the first inode cluster. > > > > I'll also cook up a testcase for repair on single AG filesystems. > > While I think we should certainly allow this, what's the worst-case > scenario for a corrupted superblock when we can't validate it and > continue with repair? > > I wonder if something like > > # xfs_repair --allow-single-sb > > should be required, with some man page docs suggesting a run with -n > first etc to be sure that garbled geometry doesn't trash the whole thing...? Maybe. Given that we don't auto fsck anyway it's at least doable. But given that there is no other way to repair a single AG filesystem I'm not sure it helps. But I can cook up a variant that requires an option. In fact existing repair code would allow it (and fail utterly) when a flag is set - there's just no way to set that flag on the command line.. From SRS0+c0a58c6b4215c0095039+1960+infradead.org+hch@bombadil.srs.infradead.org Sun Jan 4 11:42:56 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n04HgtCE032384 for ; Sun, 4 Jan 2009 11:42:56 -0600 X-ASG-Debug-ID: 1231090974-156d03ba0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2CFEE17A4B92 for ; Sun, 4 Jan 2009 09:42:54 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id elAIFpqEDkTXzB1Y for ; Sun, 04 Jan 2009 09:42:54 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LJWzX-0002dY-VX for xfs@oss.sgi.com; Sun, 04 Jan 2009 17:42:23 +0000 Date: Sun, 4 Jan 2009 12:42:23 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfstests: add test 200, exercise read-only block devices and mounts Subject: [PATCH] xfstests: add test 200, exercise read-only block devices and mounts Message-ID: <20090104174223.GA10050@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-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: 1231090975 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com Make sure we do the right thing with blockdevices with a hard read-only flag. Signed-off-by: Christoph Hellwig Index: xfstests-dev/200 =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xfstests-dev/200 2009-01-04 17:39:08.000000000 +0000 @@ -0,0 +1,120 @@ +#! /bin/sh +# FS QA Test No. 200 +# +# Check out various mount/remount/unmount scenarious on a read-only blockdev. +# +#----------------------------------------------------------------------- +# Copyright (c) 2009 Christoph Hellwig. +#----------------------------------------------------------------------- +# +# creator +owner=hch@lst.de + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_filter_scratch() +{ + sed -e "s,$SCRATCH_DEV,SCRATCH_DEV,g" | \ + sed -e "s,$SCRATCH_MNT,SCRATCH_MNT,g" +} + +_cleanup() +{ + cd / + blockdev --setrw $SCRATCH_DEV +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch + +_scratch_mkfs_xfs >/dev/null 2>&1 + +# +# Mark the device read-only +# +echo "setting device read-only" +blockdev --setro $SCRATCH_DEV + +# +# Mount it, and make sure we can't write to it, and we can unmount it again +# +echo "mounting read-only block device:" +_scratch_mount 2>&1 | _filter_scratch + +echo "touching file on read-only filesystem (should fail)" +touch $SCRATCH_MNT/foo 2>&1 | _filter_scratch + +# +# Apparently this used to be broken at some point: +# http://oss.sgi.com/bugzilla/show_bug.cgi?id=807 +# +echo "unmounting read-only filesystem" +umount $SCRATCH_MNT 2>&1 | _filter_scratch + +echo "setting device read-write" +blockdev --setrw $SCRATCH_DEV + +echo "mounting read-write block device:" +_scratch_mount 2>&1 | _filter_scratch + +echo "touch files" +touch $SCRATCH_MNT/{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9} + +echo "going down:" +src/godown -f $SCRATCH_MNT + +echo "unmounting shutdown filesystem:" +umount $SCRATCH_MNT 2>&1 | _filter_scratch + +echo "setting device read-only" +blockdev --setro $SCRATCH_DEV + +# +# Mounting a filesystem that requires log-recovery fails unless +# -o norecovery is used. +# +echo "mounting filesystem that needs recovery on a read-only device:" +_scratch_mount 2>&1 | _filter_scratch + +echo "unmounting read-only filesystem" +umount $SCRATCH_MNT 2>&1 | _filter_scratch + +# +# This is the way out if the underlying device really is read-only. +# Doesn't mean it's a good idea in practive, more a last resort +# data recovery hack. +# +echo "mounting filesystem with -o norecovery on a read-only device:" +_scratch_mount -o norecovery 2>&1 | _filter_scratch + +echo "unmounting read-only filesystem" +umount $SCRATCH_MNT 2>&1 | _filter_scratch + +echo "setting device read-write" +blockdev --setrw $SCRATCH_DEV + +# +# But log recovery is performed when mount with -o ro as long as +# the underlying device is not write protected. +# +echo "mounting filesystem that needs recovery with -o ro:" +_scratch_mount -o ro 2>&1 | _filter_scratch + + +# success, all done +echo "*** done" +rm -f $seq.full +status=0 Index: xfstests-dev/200.out =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xfstests-dev/200.out 2009-01-04 17:39:38.000000000 +0000 @@ -0,0 +1,24 @@ +QA output created by 200 +setting device read-only +mounting read-only block device: +mount: block device SCRATCH_DEV is write-protected, mounting read-only +touching file on read-only filesystem (should fail) +touch: cannot touch `SCRATCH_MNT/foo': Read-only file system +unmounting read-only filesystem +setting device read-write +mounting read-write block device: +touch files +going down: +unmounting shutdown filesystem: +setting device read-only +mounting filesystem that needs recovery on a read-only device: +mount: block device SCRATCH_DEV is write-protected, mounting read-only +mount: cannot mount block device SCRATCH_DEV read-only +unmounting read-only filesystem +umount: SCRATCH_MNT: not mounted +mounting filesystem with -o norecovery on a read-only device: +mount: block device SCRATCH_DEV is write-protected, mounting read-only +unmounting read-only filesystem +setting device read-write +mounting filesystem that needs recovery with -o ro: +*** done Index: xfstests-dev/group =================================================================== --- xfstests-dev.orig/group 2009-01-04 17:14:27.000000000 +0000 +++ xfstests-dev/group 2009-01-04 17:14:36.000000000 +0000 @@ -301,3 +301,4 @@ 196 quota auto 197 dir auto 199 mount auto +200 mount auto From agruen@suse.de Sun Jan 4 12:20:54 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n04IKqNf008744 for ; Sun, 4 Jan 2009 12:20:54 -0600 X-ASG-Debug-ID: 1231093251-5e5b01c10000-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 047B417A4BC0 for ; Sun, 4 Jan 2009 10:20:51 -0800 (PST) Received: from mx1.suse.de (mx1.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id yffqMtcXAQFLTe8K for ; Sun, 04 Jan 2009 10:20:51 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation Received: from Relay1.suse.de (mail2.suse.de [195.135.221.8]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 4AFE2458C0; Sun, 4 Jan 2009 19:20:50 +0100 (CET) From: Andreas Gruenbacher Organization: SUSE Labs / Novell To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [patch 0/4] acl patches from Fedora / Red Hat rpm Subject: Re: [patch 0/4] acl patches from Fedora / Red Hat rpm Date: Sun, 4 Jan 2009 19:20:48 +0100 User-Agent: KMail/1.9.9 Cc: Eric Sandeen References: <20081230181413.518122170@sandeen.net> In-Reply-To: <20081230181413.518122170@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200901041920.48981.agruen@suse.de> X-Barracuda-Connect: mx1.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1231093252 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com On Tuesday, 30 December 2008 19:14:13 Eric Sandeen wrote: > Here are a few patches (modulo distro-specific changes) > from the Fedora / Red Hat acl package. All four patches look good. Thanks for digging them out! Andreas From nashwa1egypt@gmail.com Sun Jan 4 16:09:36 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.3 required=5.0 tests=BAYES_50,HTML_MESSAGE, MIME_8BIT_HEADER autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n04M9apN031318 for ; Sun, 4 Jan 2009 16:09:36 -0600 X-ASG-Debug-ID: 1231106969-26ce02580000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from po-out-1718.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3F21917A4F6C for ; Sun, 4 Jan 2009 14:09:29 -0800 (PST) Received: from po-out-1718.google.com (po-out-1718.google.com [72.14.252.158]) by cuda.sgi.com with ESMTP id LJAE5U0qH3JVpteY for ; Sun, 04 Jan 2009 14:09:29 -0800 (PST) Received: by po-out-1718.google.com with SMTP id c31so15513444poi.0 for ; Sun, 04 Jan 2009 14:09:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:subject :in-reply-to:mime-version:content-type:references; bh=9vP7BCeql7yO6GSpAoyFMocEqMUJU5ND41MEXUrWwl8=; b=AvphETlAsvAj9xCjIALu8IwWWZvOCHeOARRar6dCFw3fopofwx6L/01RPkgHHq2Hm2 OMIdLOe8n45vfT6Op/Xg+bB+Bd7dg/goVy5OgDFo95qKued63CmRYt6ovThWLeeAx4ZH qADXMMJJbO5OoKNgjlk5danGTDxEYU1S/k0e8= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:subject:in-reply-to:mime-version:content-type :references; b=WvY93TTioinrotncHIGou7bXWiErkD1Iq39cf062v5sgbXWy+gW1VAuwRcsNdv+9d1 Aqoov3FXBzUmYiFQDjCpxRVS0mNo30dqtBgrKkSeFZfxnOV+pTHgryIQmdVzfwaErIqm Bi4E75vQSCA5uIuIpoPzsKkYJ2lIy5Syf3RmU= Received: by 10.114.108.15 with SMTP id g15mr13350841wac.202.1231106966239; Sun, 04 Jan 2009 14:09:26 -0800 (PST) Received: by 10.115.33.14 with HTTP; Sun, 4 Jan 2009 14:09:25 -0800 (PST) Message-ID: Date: Sun, 4 Jan 2009 14:09:25 -0800 From: nashwa1egypt X-ASG-Orig-Subj: =?WINDOWS-1256?B?48zj5trJINrR5tYg48rj7dLJIMzPx8fHx8cg4+Qg1N7e?= =?WINDOWS-1256?B?IObd4eEg5sfRx9bsIObjzeHHyiDh4cftzMfRIObH4cjt2g==?= =?WINDOWS-1256?B?IMjk2cfjIMfhyuPm7eEgx+Ha3sfR7CDa4ewgMjDT5MkgyA==?= =?WINDOWS-1256?B?x9Pax9Eg4ccgyt7H0eQg5uPmx97aIOTHz9HJIN3sIOPV0Q==?= Subject: =?WINDOWS-1256?B?48zj5trJINrR5tYg48rj7dLJIMzPx8fHx8cg4+Qg1N7e?= =?WINDOWS-1256?B?IObd4eEg5sfRx9bsIObjzeHHyiDh4cftzMfRIObH4cjt2g==?= =?WINDOWS-1256?B?IMjk2cfjIMfhyuPm7eEgx+Ha3sfR7CDa4ewgMjDT5MkgyA==?= =?WINDOWS-1256?B?x9Pax9Eg4ccgyt7H0eQg5uPmx97aIOTHz9HJIN3sIOPV0Q==?= In-Reply-To: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_Part_144361_12721996.1231106966208" References: X-Barracuda-Connect: po-out-1718.google.com[72.14.252.158] X-Barracuda-Start-Time: 1231106973 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0005 1.0000 -2.0177 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -0.43 X-Barracuda-Spam-Status: No, SCORE=-0.43 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_MESSAGE, MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14431 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.58 MISSING_HEADERS Missing To: header 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; ------=_Part_144361_12721996.1231106966208 Content-Type: text/plain; charset=WINDOWS-1256 Content-Transfer-Encoding: base64 Content-Disposition: inline KsjT4yDH4eHlIMfh0c3j5CDH4dHN7eMqCiAqzMfR7CDH4cfK3cfeIOHK5t7t2iDI0crm3+bhIMra x+bkIMjt5CDj09/kIOPV0ewg5sfNz+wg1NHfx8ogx+HK4+bt4QrH4drex9HsIOHK7dPt7dEgx+HO z+PHyiDH4drex9HtySoKKuba4ewgx+HTx8/JIMfh49TK0e3t5CDj5CDj1dEgx9HTx+Egx+HI7cfk x8ogx+Hjx+HtySDh4c/O4SDH4dHT4+wg0+bHwSDe2MfaCtrH4yDH5iDOx9Ug5t/Q4d8gx+HjyOHb ICoKKsfh48rm3dEgzcfh7ccg4eHU0cfBICjtyuMgz93aIOPkIDEwJePkIMvj5CDH4ebNz8kg5sfh yMfe7CDtyuMgz93aySDj5CDU0d/JCsfhyuPm7eEgyM7hx+Egx9PI5tog4eHIx8baICDm7crjIMre 0+3Y5SDH4e3f4yDh48/lIMrV4SDH4ewgMjDT5Mkp5t3sIM3H4QrH4drj4SDOx9HMIOPV0SDtyuMg x83Wx9Eg1OXHz8kg4cfLyMfKIMfhz87hIObj5sveySDj5CDH4d7k1eHtySDH4ePV0e3JKgoq7dHM 7CDH0dPH4SDH4cjtx+THyiDH4c3Tx8jtySDj5CDH4c/O4SDm2s/PIMfh0+Tmx8og4eHK3tPt2CDm x+HjyOHbIMfh48rHzQrm4+bH1d3HyiDH4ebNz8kgx+Hj2OHmyOUgx+HsIOXQxyDH4cft4+3hICoK Km1vbmExZWd5cHRAZ21haWwuY29tKiA8bW9uYTFlZ3lwdEBnbWFpbC5jb20+Ciog5trh7CDH4dPH z8kgx+HIx8ba7eQg4eHmzc/HyiDH4ePTzOHJIMfmIMfhyuwg4eXHIMfj38fk7ckgx+HK08zt4SDH 0dPH4QrH4cjtx+THyiDfx+PhySDm7d3W4SDj2iDR0+bjx8og5eTP0+3JIObV5tEg4eHa3sfRIObH 4ebNz8kqCirm7crjIMfhyO3aIMjP3dogMTAl5sfhyMfe7CDI1O3fIOPeyObhIMfhz93aIMjO4cfh IMfTyObaIOPkINTR38kgx+HK4+bt4SoKKubt0czsIMfhx9HTx+Eg2uHsIOXQxyDH4cft4+3hICoK Km1vaGFtZWRtb2hzZW4xZWd5cHRAZ21haWwuY29tKiA8bW9oYW1lZG1vaHNlbjFlZ3lwdEBnbWFp bC5jb20+CgoKCirl5Mcg7ebMzyDU3t4g4d7YySDm0ebaySDIx+Hj2sfP7CDmx+HKzOPaIObd7dXh IObM09Egx+HT5u3TIObH4eTS5ckg5tLH7c8K5sfh1NHm3iDmx+HayObRIObjz+3kyuwg5uPk5ccg yMfh1ebRICoKCiAqx+Ha0dYxOioqICAg4c/mx9rtIMfh093RINTeySAg3dHVySDIx+Hj2sfP7SDI w9He7SDH4ePmx97aIOPTx83K5ccgMTA1IOMyCsjDyNHHzCDI7crU5iDD4+3R7d/H5CDT7crtIMfh 49rHz+0gytTY7cgg0+bI0SDh5t/TIJYgx9PK4cfjIN3m0e0gliDa3s8gyO3aCuTlx8btIObhxyDK 5szPINrh7eXHIMPtySDD3tPH2CDm48/d5togx8rNx88gx+Hj4cffIObj1dHm3cfKIMfh49HH3d4g yMfhz+bRCsfh08fP0yDd7SDI0cwxMSDP5tEgyMfhw9PH5NPt0SDj5CA1MiDI0cwg5uPTzM8g5uPP 0dPJIObj5uEgytHd7eXtIObKzMfR7QrIx+He0cgg4+Qg38fR3ebRIObkx8/tIMfh1e3PIMfhzM/t zyDm5MfP7SDmx8/tIM/M4ckg09rRIMfh48rRMjMwMCDM5O3lIOPV0ewKyMrT5e3hx8ogIMfh09rR INTH4+Egx8rNx88gx+Hj4cffIObH4ePRx93eIObH4cPTx+TT7dEqCgoqX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXyoKCiogKgoKKiDH4drR1jI6ICAg4eHT3+Qgx+Hd5tHsIMjj5t7a IOPK4+3SIMjH4ePax8/sIMjH4d7RyCDj5CDjzdjJIMfh48rR5iDj5NjeyQrRx97tySAgKirU3skg ytTY7cgg0+bI0SDh5t/TKiog49PHzcrlxyAxNDAg48rRIMrY4SDa4ewg4+TH2dEg2Mjt2u3JIOPd yubNyQouICDKyt/m5CDj5CDNzNHJIOTm4yDfyO3RySA1IOPK0SDd7CA2IOPK0SDmzczRySDk5uMg x9Xb0SDm0dPI1OQg5tXH4ckgyubS7doK5s3jx+Mg5sfNzyDm49jIziDm7ePf5CDH1sfdySDN48fj INXb7dEgLuPY4ebIIDM5NSDH4d0gzOTtySDj1dHsICjN5sfh7CA3MQrH4d0gz+bhx9Egx+PR7d/s ICkg4+Pf5CDH4cjt2iDIyNrWIN7Y2iDH4cfLx8sg5uPf7d3HyiDH4eXmx8Eg5u3mzM8g4eXHINXm 0SoKCiogKgoKKtrR1jM6KiogICDU3skgMTY14yDIx+Hk0uXJIMfhzM/tz8kgKgoKKuHhyO3aINrh 7CDH4ePNx9HJINrIx9HJINrkIDPk5uMg5jPR08jU5CDmMs3jx+Mg5uPYyM4g5sjlxyDf5dHIx8Eg 5trPx8/m1MjfyQrj7cflIObHyObHyCDmMuPV2s8gztTIIObY3uMgx+Hm4+3Kx+Egx9Pmz9vt0SDj zNHmzckgx+HT2tEg49vR7CDMz8cg4eHI7dog2uHsCjM0MMfh3SDM5O3lIOPV0ewgKgoKKtrR1jQ6 KiogICDU3skgz+3h5t/TIDE1MOMgzuHdIM3P7d7JIMjP0SDIx+Hk0uXJIDLM09Egx+HT5u3TKgoK KuHhyO3aINTeySDRx8baySDa4ewgx+HT3+Qgx+Hd5tHsIMjN0e3JIMjH4c/m0SDH4c7H49Mg5u3m zM8g49XazyDH4cjRzCDa4ewK1N7K7eQg5uXmINrU0ckgx8/mx9EgytTY7cgg0+bI0SDh5t/TIM/t 3+bRx8og0cfG2skg5uPPzuEg3cfO0SDIx+HRzsfjIObtzM8K48fK5tEg4eHj7cflIObO0sfkx8og 2uHsINTH0dogKiog48rd0dog4+Qg1MfR2iDH4c7j0+3kIMjM5sfRIMfh49rlzyDH4cfS5dHsCtjh x8baIMfhx9Ll0SDH4dTR7d0gytTY7cgg0cfG2iDm0cfe7CDm5ewgM9vR3SDk5uMg5jLN48fjIMjH 4dHOx+Mgx+HTx97YCubj2MjOIMjH4dHOx+Mgx+HPx8bR7CDm0dPI1OQz3tjaIMjP7d/m0cfKINHH xtrlICAqCgoqICoKCiogKgoKKtrR1jU6KiogICDU3skg5MfV7ckgx+PH4yDI5sfIySDkx8/sIMfh 1OPTIObd5M/eIMfh0+HH4yAxNTDjICoKCirH4d3t5iDM09Egx+HT5u3TIObd5M/eIMfh0+HH4yDI 1MfR2iDd4dPY7eQgz+bRIM7H49Mg5sfh2t7H0TXHz+bH0ebH0dbsICDayMfRyQra5CAz5ObjIOYq KiDj08fNySDH4dvR3SAxNiDjIDIgliAxNCDjMiCWIDIwIOMyICDmIOPTx83JIMfh0e3TyNTkIMfh w8zjx+HtyQo0MCDjMiAg5iDj08fNySDH4c3jx+Mgx+HfyO3RIDYg4zIgICDmx+HV2+3RIDIg4zIg ICDH4ePYyM4gIDcg4zIgIOPTx83JCsfh2NHeySDH4ePmzObPySDI7eQgx+Hb0d3K7eQgx+HPx87h 7crt5CDmx+HN48fj7eQg5sfh49jIziDK08fm7SA2IOMyICoqKgoKKuPTx83JIMfM48fh7ckg4eHI 4d/m5MkgMjAg4zIgIMrU2O3IINPmyNEg4ebf0yDT7dHH4+3fINrPxyAy29HdySDk5uMgyMfR3+3l Cuba3s/lxyDVzckgyube7dog4+Qgx+Hjx+HfIMfhx9Xh7CDh4dTeySAg5sfh09rRIMfh49jh5sgg 4eHI7dogMjI1MMzk7eUg49XR7Arh4ePK0SAqCgoqICoq2tHWNjoqKiAgINTeySDkx9XtySDI3e3h xyDIx+HKzOPaIMfhzsfj0yDH4c3P7d7JIMfh3e3mINrh7CDNz+3eySAg5uPkCszl5SDHztHsINrh 7CDH4ePa5c8gx+Hax+HsIOHh2uHm4yDH4cfPx9HtySAqCgoq4eHI7dog1N7JIDIwMOMgyMfhyszj 2iDH4c7H49Mgx+HN7CDH4crH4cog2sjH0eUg2uQgM+Tm4yDmNNHTyNTkIOYyzePH4wrm49jIziDm yOHf5uTlIObl7CDOx+HVySDH2uPH4SDH4eTMx9HJIObH4dPIx9/JIObH4d/l0cjHwSDmx+HP5cfk x8og7eTe1eXHCsfh0+3Rx+Pt3yDH4dPa0SDH4ePY4ebIIDYwMMfh3SDM5O3lIOPV0ewgKgoKKtrR 1jc6KiogICDU3skgMTM14yDIx+Tm0cfjxyDa4ewgzc/t3skg38jt0ckgyMfhyszj2iDH4cvH4csg 4+be2iDjyuPt0grMz8fHx8cqCgoq4eHI7dog1N7JIMjH09/H5CDH4dTIx8ggx+HH08rL48fR7CDI 4+be2iDj4+3SINrIx9HlINrkIDPk5uMg5jLR08jU5CDmMs3jx+MK5uPYyM4g49PHzckg1cfd7ckg yM/m5CDj5Mfm0SDIx+HP5tEgx+HRx8jaIObH4drex9EgM8fP5sfRIObH0dbsIObI5ccg28fSCtjI 7drsIMzj7dogx+Hb0d0g5sfhzePH48fKIObH4ePYyM4gytjhINrh7CDH4dTH0dog5sfhzc/t3skg 5u3mzM8gx+HV5tEKx+HOx9XJIMjH4dTeySDmx+Hd7eYgx+PHIObV3SDH4cfLx8sqCgoqyOXHINvR 3ckgKirb0d3JIOTm4yDO1Mggx9HmIN3m0SDd5tHM7eUg5sjlxyDT0e3RIDE3MNPjIOYg29HdySDI 5cfaz88gMiDT0e3RCjEyMCDT4yDmz+bhx8ggyOHH38fRIM7UyCDH0eYgIObK0cjt0skgyuHt3dLt 5uQg5iDb0d3JIOPa7dTJIMjlxyDH5MrR7eUKIN/H5MjlIDIg5t/H5MjlIDMg5t3myu3lIObj38rI ySAg5srRyO3SySDmINXH4ebkIN/H4+EgyOUg38fkyMkgMwrm38fkyMkgMiDmMt/R0+wg5grT3dHJ IN/H4+HJIM7UyCDH0eYg5sjlxyDP5uHHyCDd1u3HyiDmyObd7eUgIObK0cjt0skgOCDf0cfT7CDm IOPYyM4g38fj4SDO1MgK3tTRySDH0eYg5iDM0sfjySDO1Mgg38jt0ckg5iDL4cfLIOPRx8rIINPm 08ogysff7CDmINPMx88gyN/hIMfh29HdIObH4dXH4ebkCubH4dPd0ckg5iDTysfG0SDjx9HP7eTs INPKx+3hIMfj0e3fx+TsINrh7CDf4SDUyMffIObI4d/m5Mkg5iDaz88xIMrh7d3S7ebkICAyNQrI 5tXJIMrm1O3IxyDm2s/PMSDK4e3d0u3m5CAyMSDI5tXJIOTH1O3m5MfhIObaz88xINHt0+3d0SDH 08rRxyDIx+HYyN4gMTgw0+MK48rN0d8g5iDaz88gMSAgyt/t7d0g1MfRyCDMz+3PIObaz88gMSDK 3+3t3SDfx9Ht0SDMz+3PIOYgz93H7ckgx+bh7ePI3yDS7coK5uPR5s3JIMrm1O3IxyDIx+HR7ePm yiDm49/k08kg3+XRyMfG7ckqKiDmKiog29PH4ckg3ebhIMfK5uPHyu3fIMftz+3H4QrSx+Tm0+wg MTggyNHkx+PMIOYgy+HHzMkgyubU7cjHIDE0IN7P4yDmIMjmyszH0iDt5uTt3dHTx+EgNSDU2uHJ IOYgyubTysfRCt/l0cjsIObU3cfYIN3tz+3mIOYg48ft39Hm5u3dIOYyINPOx+Qg28fSIMfm4ePI 7d8g5iDt5uTd0dPH4SDmIOTM3SDfx+PhCsjH4dvR3SDmIMfh093RySDmx+HVx+Hm5CoKCira0dY4 OioqICAg1N7JIOHe2MkgOTDjIMjH4d7H5dHJIMfhzM/tz8kgytXhzSDj38rIINrtx8/JIMfmINPf 5CDh2OHIySDH4ePa5c8KyMzmx9HlKgoKKtTeySDK1eHNIOHM4+3aIMfhx9vRx9Yg5uHhx9PKy+PH 0SDH7dbHIOPK1NjI5SDIx93W4SDj5t7aIMjH4d7Yx+PtySDIx+HKzOPaCsjH4d7RyCDj5CDj2uXP IMfh1eTH2sfKIMfh48rY5tHJIMfh09rRIMfh49jh5sgg49vR7CDMz8fHx8fHx8fHx8cg3d7YIDEy MMfh3QrM5O3lIOPV0ewqCgoq2tHWOToqKiAgIN3R1ckg5MfP0ckg1N7JIMjH4drI5tEgyMfhz+bR IMfhysfk7CDH48fjINPkytHH4SDH4drI5tEqCgoq4eHI7dog1N7JIMjH4drI5tEg49PHzcrlxyA2 M+Mg2sjH0eUg2uQgMuTm4yDm1cfh5SDj2OHmyCA2Ncfh3SDM5O3lIOPV0ewK5tTl0ewgNzAgzOTt 5SDj1dHsIObk3uEgx+Hj4d/tySDjyMfU0ckgx+Hjx+HfICoKCira0dYxMDoqKiDU3skgNjPjIMjH 4drd1CDmx+HHzOXSySDIx+HU0ebeKgoKKuHhyO3aINTeySDP5tEgx9HW7CDj08fNySA2M+Mg2sjH 0eUg2uQgMuTm4yDm1cfh5SDm49jIziDmzePH4yDjytTYyOUg5sjlxwrM4+3aIMfhx8zl0skg5sfh 2t3UIMfh09rRIDEyMMfh3SDM5O3lIOPV0ewgKgoKKl9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXyoKCira0dYxMToqKiAg48zj5trJINTe3iDjyu3j0skgzM/HIMjH4dTtziDSx+3P IOPTx83HyiDjzsrh3ckqCgoqMV8qKiDU3skgz+bRIMfR1uwg49HK3dog49PHzckgMTAw4yDayMfR ySDa5CAy5ObjICDfyO3RyeYy0dPI1OQg5s3jx+Mg5uPYyM4K5sjh3+bkICDK1eHNIMrMx9HsIMfm INPf5Owgx+Ygx8/H0ewgx+PH4yDT5MrRIM3t5uwgzM/Hx8cg5sft1scg2uHsIM3P7d7JCt/I7dHJ IM7H4dXlIOPaIMfhyOTfIOPY4ebIINPa0SDhxyDt3sfR5CAgMTE1x+HdIMzk7eUg49XR7CDd3tgq CgoqMl8qKiDU3skgNzDjIMrI2iDH4czlx9IgyMfh1O3OINLH7c8gx9PKy+PH0ewgz+bRMyDj08fN ySA3MOMgytTY7cggx+HM5cfSCuPY4ebIIDg1x+HdIMzk7eUg49XR7CDm2uHt5ccgNjQwzOTt5SDU 5dHsIOHjz+UgMjDT5MkgKgoKKjNfKiog1N7JIDE4NeMgyMfh1O3OINLH7c8gyMfhzewgx+HH5uEg x+HjzMfm0ckgx+HLx+TtySDa48fRySDH5cfh7CAg2sjH0eUK2uQgM+Tm4yDm1cfh5SDm29HdySDY 2sfjICDmMs3jx+Mg5uPYyM4g5sjh3+bkIObt5szPIMft1scg1N7K7eQg5N3TCsfh49PHzckgIOPj 3+QK1uPl4yDa4ewgyNrWICoKCira0dYxMjoqKiAgINTeySAxMDDjINrh7CDUx9HaIN3t1eEgx+HR xu3T7CDK1NjtyCDP7eHm39MqCgoq4eHI7dog1N7JIN/h5ccg2uHsIN3t1eEgx+HRxu3T7CDVx93s IDg14yDayMfR5SDa5CAy5ObjIOYz0dPI1OQg5s3jx+Mg5uPYyM4KyMfhz9Qg5sfhyuHt3ebkIObH 4crh7d3S7ebkIMjH4c/m0SDH4dHHyNog5sjlxyDP7d/m0cfKIObUyMfI7d8gx+Hm4+3Kx+EK2uPH 0ckg38jt0ckg5uPPzuEg1O3fINPhx+HjIObH09rJICDH4dPa0SDRx8baIDE0Ncfh3SDM5O3lIOPV 0ewgKgoKKtrR1jEzOioqINTeySDI48/t5MrsICDH4ePRzeHJIMfh08fP08kgIMfM48fh7CDH4d7t 4+UgNTIxx+HdIMzk7eUg49XR7ArmODAwzOTt5SDj1dHsICDm0OHfINrh7CAxMNPk5sfKIMrj4yDP 3dogMjnH4d0g5jY1MMzk7eUg5sfUytHH3yDH4eTHz+wKNDAwMMfhx90g5tTl0ewgMTMwNczk7eUg 49XR7CDmyuTe1SDI2s8gx9HHyNog0+Tmx8ogx+HsIMfh7CAxMjEwzOTt5SDj1dHsICDj2OHmyArH 5t3RIDQ1x+HdIMzk7eUg49XR7CAqCgoq2tHWMTQ6KiogINTH4e3lIN7jySDj5CDH4dHm2skg5sfh 5c/mwSDIx+HTx83hIMfh1OPH4e0gx+Hf7eHmIDQ1IOPK1NjIINPmyNEK4ebf0yAgyMfh3dHUIMvH 5O0g1d0gyM3RIMje0e3JIMfh1Mfh7eUgMTIw4yDmMs3P7d7lIM7h3ewg5sfjx+PtIOHlIOPPzuEg zsfVCt3t5ccgMiDN48fjINPIx83lIObj5uEg5szH49og5t/H3crR7ccg5uTZ7d3lIMzPxyDK5szP IMfh1ebRIMfhzsfVySDIx+HUx+HtyQoqCgoqx+HT2tEgx+Hj2OHmyCA0NTDH4d0gzOTt5SDj1dHs ICoKCirH5Mrl0iDH4d3R1ckg48zj5trJIMfRx9bsIOPK4+3SySDT2tEgx+HjytEg7cjPxyDj5CA2 NTDMIM3K7CAzMjAwzCDIx+Hax9TRCuPkINHj1sfkIObH4d7H5dHlIMfhzM/tz8kg5sfh1NHm3iDm 1MjRxyDmyOTlxyDmx9Pjx9rt4e3JIObIz9EqCgoKCirH4drR1jE6KiogICDe2NrJIMfR1iDI09rR IOPb0ewg09rRIMfh48rRIDY1MMzk7eUg49XR7CDd3tggKgoKKsjH4drH1NEg4+Qg0ePWx+Qg48/t 5Mkgx+HR5tbJICDH4c7W0cfBIMjM5sfRIOPP7eTJIMfh7cfT4+3kIOPTx83JIDIzMuMK487V5eUg 09/kINrHxuHsIDTHz+bH0SDa7CDUx9HaINHG7dPsIDEy4yDm48cg7ePt0uXHIMft1scg4e3TIOHl xyDjz+Ug0uPk7eUK4eHI5MfBIObmyOXHIOPRx93eIN/m48jm5M8g5s7H4dXlIMfhy+PkIObH5MrZ 0SDH7dbHIMfkIOXkx98gyt3H5tYg3ewgx+HT2tEgKgoKKsfh2tHWMjoqKiAgIN3R1ckg4dnR5t0g 5czRySDe2NrJIMfR1iDd1sfBIOHhyO3aIMjjz+3kySDH4d7k2NHJINTR3trh7Arkx9Xtyu3kICDj 08fNySAxNzDjIMzH5dLJIOHhyOTHwSDfx+PhySDH4ePRx93eIMfh4+3H5SDH4d/l0cjHwSDm09rR IMfh48rRCjI4MMzk7eUg49XR7CoKCirH4drR1jM6KiogICDh0cfbyOwgx+HK4+3SIN7Y2skgx9HW INrh7CDH4dTH0dogx+HRxu3T7CDIx+HKzOPaIMfhzsfj0yoKCirh4cjt2iDH0dYgyMfh3sfl0eUg x+HMz+3PySDT3+Qg2sfG4ewg4+TY3skgx+Hj08rL49Ht5CDa4ewgx+HUx9HaIMfh0cbt0+wKx+Hh 7CDa4ewg5MfV7crlIM3sIMfh49XRx+btySDH4ePK3dHaIOPkINTH0dogx+HK09rt5CDj5t7aINHH 3uwgzM/Hx8fHx8cK49PHzckgMjgw4yDmyuMgx9PKztHHzCDRztXJIOPIx+TsIMjP0ebjIObH0dbs IOYzx8/mx9Eg09rRIMfh49jh5sgg4eHjytEKMzIwMMzk7eUg49XR7CoKCirH4drR1iA0OiAgKirH 0dYgyMfh1NHm3iDjyuPt0skgzM/Hx8fHIMfjx+Mg48/t5MrsICoqKgoKKuHhyO3aIN7Y2skgx9HW IOPTx83K5ccgIDg2NOMgx+PH4yDjz+3kyuwgze3LIMfh3e3mIMfh0cfG2iDmx+Hlz+bBIMjH4ePk 2N7JCsfhzsfj08kgx9HWINrjx9HHyiDIz9Hm4yDmx9HW7CDmM8fP5sfRIOPK39HRySAg49jh5sgg NTAwx+HdIMzk7eUg49XR7CAqCgoqx+Ha0dY1OioqICAgICDH0dYg4d7YySDa4ewgx9/I0SDmx9Tl 0SDj7c/H5CDI1MjRxyDkx9XtySDIzdHsINvRyOwg5trh7ArH4ePK0eYqCgoq4eHI7dog3tjaySDH 0dYgyNTI0ccgKirI4+be2iDH38vRIOPkIOPjysfSIMrV4c0g4d/H3ckgx+Hj1MfR7dogx+HH08rL 48fR7ckK0MfKINHIze3JINrH4e3JIMzPx8fHx8fHxyDmyt7aIObT2CAgx9/I0SDKzMfRIN7Y2iDb 7cfRIMfh0+3H0cfKIObK2OEg2uHsCsfh4+3Px+Qg5uPK0eYgx+HH5N3H3iDjyMfU0ckgIOPTx83K 5ccgNTcw4yDmx+HT2tEgx+Hj2OHmyCDh4ePK0SAzMDAwzOTt5Qrj1dHsICoKCirH4drR1jY6Kiog ICDH0dYg48rj7dLlICAzMTXjINrh7CDH4dTH0dogx+HRxu3T7CDI48/t5MkgyM/RKgoKKuPP7eTJ IMjP0SDh5ccg49PK3sjhIMjH5dEg5sfhx9HWIOPj7dLJINTH0dog0cbt0+wgx9HI2iDNx9HHyiDm 4+Qgx+HO4d0K4+TY3skgztbRx8Eg5sfT2skgy8fk7CDe2NrJIOPkIMfh5MfV7ckg7d3V4eXjxyDj 49EuIOPN3ebRySDmzMfl0skg4eHI5MfBCt/H4+HJIMfh49HH3d4gKgoKKsjH4dHO1ckgyM/R5uMg 5sfR1uwg5svhx8sg48rf0dEgysfR7c4gx+HRztXJNi8yMDA4IObj08fNySDH4cfR1uwgMTgw4wrm x+Hjyt/R0TE4Ni414yDj5eHJINPkySDI5MfBIObT5MkgytTY7cggx+Hj2OHmyCAxMjDH4d0gzOTt 5SDj1dHsIN/H1CDm2uHt5ccKNTfH4d0gzOTt5SDj1dHsICDh4czlx9Igx8jKz8fBxyDj5CDT5OUg MjAxMCDH4ewg0+TlIDIwMTYqKiAgKiogICAqKiAqKioKCiogKgoKKsfh2tHWNzoqKiAgICoqw9HW IMjH4ePRzCDK1eHNIOHF3sfjySDjzsjSIMfmIObNz8fKINPf5O3JIMjT2tEg4d7YySoqKgoKKt7Y 2skgw9HWIMjH4ePRzCDj08fNySAxNzcg48rRINrh7CDUx9HaINHG7dPsICDK1eHNIOHI5MfBIOPO yNIg5ubNz8fKINPf5O3JKgoKKsfh2tHWODoqKiAqKiAg4cfVzcfIIMfh49TH0e3aIMfhyszH0e3J ICDH5Mrl0iDH4d3R1ckg09rRIMfh48rRODAwKioqCgoqzCDH0dYyMzLjIMjH4cfT48fa7eHtySAq Cgoq4eHI7dogx9HWIMrV4c0g4cfex+PJIOPU0ebaIMrMx9HsIMjH4cfT48fa7eHtySAqCgoqICoK Cirmx9HWIMfO0ewg3tjaySDD0dYg49PHzcrlxyAyMzAg48rRIMjH4drR7dTtySDIzObH0SDj08zP IMfh1O3OIM3T5CDK1eHNCuHI5MfBIOPOyNIgIObmzc/HyiDT3+TtySAqCgoqx+Ha0dY5OiAgICAq KsfR1iAxNTDjIMjH4ePkx+3dIMjH4cfT48fa7eHtySoqICoKCirh4cjt2iDH0dYg48jH5OwgyMfh 4+TH7d0g38fj4ckgx+Hj0cfd3iDH0dYgyt7T7eMg09rR5ccgNjDH4d0gzOTt5SDj1dHsIN3e2Arh xyDb7dEqCgoqx+Ha0dYxMDoqKiAgICoqx9HWIMjHzdPkIOPkx9jeIMjI5OXHICoqKgoKKuHhyO3a IMfR1iDIyOTlxyDj08fNyuXHIDQ4MuMgyMfd1uEgx+Hj5MfY3iDT2tEgx+HjytEgNzAwMMwg4eHj ytEqCgoqx+Ha0dYxMToqKiAgICAqKsfR1iDh4cjt2iDa4ewg2NHt3iDH09/kz9HtySDH4dXN0cfm 7CAgz8fO4SDf5uPI5uTPKioqCgoq4eHI7dogx9HWIOPTx83K5ccg3c/H5CDfx+PhINrh7CDY0e3e IMfT3+TP0e3JIMfh1c3Rx+bsIMfh3+3h5jU4ICDPx87hCt/m48jm5M8g49PHzcrlxyDdz8fkIMfs IDQyMDAg48rRIMfh09rRINTH4+Egztggx+Hf5dHIx8Eg5sfh4+3HySoKCirH4dPa0SDH4ePY4ebI IDQ1MMfh3SDM5O3lIOPV0ewgKgoKKiAgICAgICAgICAgICAgICoq3dHVySDh5CDKyt/R0SDH0dYg yszH0e3JyMzmx9Egx+HMx+PaySDH4cfj0e3f7ckqCgoq4eHI7dogx9HWIOHe2MkgyszH0e3JIMjH 4d7H5dHJIMfhzM/tz8kgyMfhyszj2iDH4c7H49MgyMzmx9Egx+HMx+PayQrH4cfj0e3f7ckg48rj 7dLJIMzPxyDj5t7aIMrMx9HsINHHxtog49PHzcrlxyA4MMfh3SDjytEg49HI2iDt5szPIM/Rx9PJ IMzP5uwK4+Qg1NHfySDax+Hj7ckg4cfex+PJIOPm4SDKzMfR7CDH4dPa0SDH4ePY4ebIIOHh48rR INHHxtog3+bk5ccgyszH0ewKNDAwMMzk7eUg49XR7CDd3tgg5u3mzM8g3tjaIMfRx9bsIMfO0ewg yNPm0e3HIObe2NEg5sfhyM3R7eQg5sfhx+PH0cfKCubH4dPa5s/tySoqKgoKKuHRx9vI7CDU3t4g 5t3h4SDex+Tm5CDMz+3PIMjPx+3J4+QgNjAwzOTt5SAgyMfh1NHm3iDm49XRIMfhzM/tz8kg5uPP 7eTJIOTV0Qrmx+HKzOPaIObH4ePe2OMgIObU7dHHyubkIMjj08fNx8og487K4d3JICAqCgoqx+Ha 0dYgMToqKiAgICAqKtTeySDI09rRKirh3tjJKiogNjAwzOTt5SDIx+HU0ebeIMjM5sfRIOTHz+wg 5eHt5sjh7dMqKiAgKioKKioqCgoqx+HU3uUgyMfT38fkIOPIx9HfIMjM5sfRIOTHz+wg5eHt5sjh 7dMgx+HMz+3PIObkx9XtySDMz+3PySDK1NjtyCDT5sjRIOHm39MK4eMgytPK2uPhINrh7CDNz+3e ySDIx+HP5tEgx+HH0dbsIOPTx83JIDEzMOMg2sjH0eUg2uQgMuTm4yDmM9HTyNTkIObN48fjCubj 2MjOIObI4d/m5CDmx+HT2tEgx+Hj2OHmyCDh5CDtyt/R0SDd3tggNjAwzOTt5SDj1dHsICoKCirH 4drR1jI6KiogICAqKtTeySDPx87hIN/m48jm5M8g5sfP7CDH4dHI7dogyMfh1NHm3ioqKgoKKsfh 1N7lIMjj5t7aIOPK4+3SIMjM5sfRIOTHz+wg5eHt5sjh7dMgx+HMz+3PKiogKirO4d0g4cThxMkg x+HU0ebeIObH7dbHCs/HzuEg3+bjyObkzyDj38rj4SDH4c7P48fKIObH4ePRx93eIOPTx83JIDEz NOMg2sjH0eUg2uQgM+Tm4yDmMtHTyNTkIDLmzePH4wrm49jIziDmyOHf5uQgx+HT2tEgMTIwMMzk 7eUg49XR7CAqCgoqx+Ha0dYzOioqICAgKirU3skyMDDjIN7H5ObkIMzP7c8gyNTH0dogx+HL5tHJ IMfh0cbt0+wgyOPV0SDH4czP7c/JKiogKgoKKuHhx+3Mx9Eg1N7lIMja48fRx8ogx+HU0d/JIMfh 09rmz+3JIMjUx9HaIMfhy+bRySDH4ePH2ckg5uXsIO3H4c/m0SDH4crH5OwK49PHzckgMjAw4yDa yMfR5SDa5CAz5ObjIOY00dPI1OQg5jPN48fjIOYyyOHf5uQg5u3mzM8g29HdySDjx9PK0SDm48rU 2MjlCsjH0d/t5SDmyObR0+Ht5CAg5uPY4ebIIN3t5ccgMTc1MMzk7eUg49XR7CAqCgoqx+Ha0dY0 OioqICAqKtTeySDRx8baySAxODDjIMfh3e3mINrh7CDkx8/sIMfh2O3Rx+Qg48jH1NHJIMjj1dEg x+HMz+3PySoqKgoKKuHhx+3Mx9Eg3sfk5uQgzM/tzyDU3skgyNPH5Mog3cfK7ePHIMfh3e3mIMff y9Eg4+Qg0cfG2iDa4ewg5MfP7CDH4djt0cfkCsjUx9HaIMfN488g3cTHzyDH4dHG7dPsIOPTx83J IDE4MOMg5sfh1cfd7CAxNjDjINrIx9HlINrkIDLk5uMg5jPR08jU5CDmzePH4wrm49jIziDK1Njt yCDT7dHH4+3fIN/h5ccg5t/Rx+Tt1CDIx+HT3t0gz8fO4eXHIMjH5Oblx8ogyMfhz+bRIMfh0cfI 2grmx+Ha3sfRNcfP5sfRIObH4dPa0SDH4ePY4ebIIDIyNTDM5O3lIOPV0ewqCgoqx+Ha0dY1Oioq ICAgKirU3skgMjIw4yDI2uPH0cfKIMfh48/d2u3JIMfjx+Mg0+3K7CDTysfR0ioqKgoKKuHhx+3M x9Eg3sfk5uQgzM/tzyDH48fjINPtyuwg08rH0dIgz+bROSDIMuPV2s8g2sjH0eUg2uQgM+Tm4yDm M9HTyNTkIObN48fjCubj2MjOIObI4d/m5CDK1NjtyCDIx9Hf7eUg5tPt0cfj7d8g2uPH0cfKINTt 3yDMz8cgx+Hd7eYg0cfG2iDH4dPa0SDH4ePY4ebICjI1MDDM5O3lIOPV0ewqCgoqx+Ha0dY2Oioq ICAgKirU3skgMTUw4yDO4d0g5MfP7CDH4eTV0SDhzOPt2iDH4cfb0cfWIMjj1dEgx+HMz+3PySoq KgoKKuHhx+3Mx9Eg3sfk5uQgzM/tzyDU3skgyNTH0dog2uHsIN3l48kg38fj4SDP5tEgx+bhIMrV 4c3TINPf5CDj3tEgx8/H0ewK4czj7dogx+HH29HH1iDayMfR5SDa5CAz5ObjIOYy0dPI1OQg5jLN 48fjIObj2MjOIObI4d/m5CDK1NjtyCDT7dHH4+3fIM/lx+THygrNz+3LySDH4dPa0SDH4ePY4ebI MzAwMMzk7eUg49XR7CAqCgoqx+Ha0dY3OioqICAg1N7JIMfPx9HsIMjj5t7aIM3t5uwgzM/HINrh 7CDj7c/H5CDK0e3j3SDa4ewg1MfR2iDH4eTS5ckKx+HRxu3T7CoKCirU3skg3sfk5uQgzM/tzyDI x+HP5tEgx+HKx+TsIN/j3tEg1NHfySDHz8fR7CDj08fNySAxODDjINrIx9HlINrkIDPb0d0K5jPR 08jU5CDmzePH4yDm49jIziDK1NjtyCDI4cfYIOPH0sft3+Yg5s3jx+Mg5uPYyM4g0+3Rx+Pt3yDH 4dPa0SDH4ePY4ebICjM1MDDM5O3lIOPV0ewgKgoKKsfh2tHWODoqKiAgKirU3skgz+bRIMfR1uwy MjDjIMjf4e3lIMfhyOTHyiDK1eHNIOHM4+3aIMfhx9vRx9YqKiAqCgoq4eHH7czH0SDex+Tm5CDM z+3PIMjf4e3lIMfhyOTHyiDH0dbsIOPRyt3aIMjjz87hIM7H1SDayMfR5SDa5CA129HdIOYz0dPI 1OQK5jLN48fjIObj2MjOIObI4d/m5CDK1NjtyCDT7dHH4+3fIObK1eHNINPf5Owgx+Ygx8/H0ewg x+YgzdbH5OUg4cfk5ccgx+HH5ArN1sfk5SDH4dPa0TYwMDDM5O3lIOPV0ewgKgoKKsfh2tHWOToq KiDd0dXJINTe5SDex+Tm5CDMz+3PIMjt5CDayMfTIObj39HjINrI7c8qKioKCirU3skg49PHzckg MjMw4yDI48/t5Mkg5NXRIMfh4+TY3skgx+HTx8/TySDayMfR5SDa5CAz5ObjIOY00dPI1OQg5jLN 48fjCubj2MjOIObI4d/m5CDIx+HP5tEgx+HRx8jaIMrU2O3IIMjhx9gg2sfP7CDmx+HN48fjIObH 4ePYyM4g0+3Rx+Pt3yDmytXhzSDT3+QKx+Yg49/KyCDj2OHmyCAxODAwzOTt5SDj1dHsKgoKKsfh 2tHWMTA6KiogICAqKtTeySDI09rRIOPb0ewgx9HW7CDIzc/t3skgzuHdIM3P7d7JIMfh2N3hIMja 48fRySDMz+3PySoqKgoKKtTeySDex+Tm5CDMz+3PIM7h3SDNz+3eySDH4djd4SDI48/t5Mkg5NXR IMfR1uwgyM3P7d7JIM7h3e3lIOPTx83JIDEzMOMK2sjH0eUg2uQgNdvR3SDm1cfh5SDmMs3jx+Mg 5uPYyM4g5sjh3+bkIObt5szPIMzRx8wgzsfVIMjlxyAgx+HT2tEg3d7YCjIwMDDM5O3lIOPV0ewg KgoKKsfh2tHWMTE6KiogICAqKtTeySDex+Tm5CDMz+3PIDE3NeMgyMfhysfT2skgyOPP7eTJIOTV 0SoqKgoKKuHhx+3Mx9Eg1N7JIMjH4c/m0SDH4c7H49MgyNrex9ExMc/m0SDIMuPV2s8g2sjH0eUg 2uQgM+Tm4yDmM9HTyNTkIOYyzePH4wrm49jIziDmyOHf5uQgytTY7cgg0+3Rx+Pt3yDH4dPa0SDH 4ePY4ebIIDI1MDDM5O3lIOPV0ewgKgoKKsfh2tHWMTI6KiogICoq1N7JIDIwMOMgyMzmx9Egx+HT 0cfMIM7h3SDH4ebkz9Eg4cfkzyoqKgoKKtTe5SDex+Tm5CDMz+3PIM7h3SDH4ebkz9Eg4cfkzyDI 48/t5Mkg5NXRIMfh4+TY3skgx+HLx+PkySAgyMfhz+bRIMfh08fP0wrmx+Ha3sfROMfP5sfRIMjj 1drPINrIx9HlINrkIDPk5uMg5jTR08jU5CDmMs3jx+Mg5uPYyM4g5sjh3+bkINrh7CDH4ePNx9HJ CubI5ccg5MzH0ckg5tPIx9/JIObf5dHIx8Eg4+be2iDRx97sIMzPxyDm5cfP7CDmx+HT2tEgx+Hj 2OHmyCAyNTAwzOTt5SDj1dHsICoKCirH4drR1jEzOioqICAqKuHRx9vI7CDH4dPf5CDex+Tm5CDM z+3PIMjj5t7aIOPK4+3SIObRx97sIMjjz+3kySDk1dEqKioKCirU3skg4eHH7czH0SDIx+HT3cfR x8og4+be2iDj4+3SIOTH1e3JIMjI0cwg3c7jIMjH4c/m0SDH4TMg5sfh2t7H0TExz+bRCsgy49Xa zyDj08fNySAxNzXjINrIx9HlINrkIDPk5uMg5jPR08jU5CDmMs3jx+Mg5uPYyM4g5jPI4d/m5CDK 1NjtyCDT7dHH4+3fCubj08rm7e3kIMfh09rRIDMwMDDM5O3lIOPV0ewgKgoKKsfh2tHWMTQ6Kiog ICAqKtTeySDex+Tm5CDMz+3PIDIwMOMg5MfV7ckgyOPP7eTJIOTV0SoqKgoKKuHhx+3Mx9Eg1N7J IMjH4dPHyNrJIMjjz+3kySDk1dEgz+bRIMrH5Owg5sfh2t7H0TExz+bRIMgy49XazyDj08fNySAy MDDjCtrIx9HlINrkIDPk5uMg5jPR08jU5CDmMs3jx+Mg5uPYyM4g5sjh3+bkIMrU2O3IINPt0cfj 7d8g5sfh09rRIMfh49jh5sgKMzAwMMzk7eUg49XR7CAqCgoqx+Ha0dYxNToqKiAgIOHRx9vI7CDH 4crj7dIg5sfh3c7H48kg5sfh09/kIMjU3t4g5t3h4SDIx+HKzOPaIMfhzsfj0yAqCgoqKMOdKSAg ICAgICAqKtTeySDdx87RySDa4ewg1MfR2iDH4czm4d0gx+HRxu3T7CDN7csgx+HK4+3SIMfh2sfh 7CDH4d3t5iDa4ewK4+3Px+Qgx9HHyO3hxyoqKgoKKuPTx83JIDIwMOMg2sjH0eUg2uQgM+Tm4yDm M9HTyNTkIOYyzePH4yDm49jIziDmyOHf5uQg5jLI4d/m5CDK1NjtyCAg3cfO0cfh09rRCsfh49jh 5sggMjAwMMzk7eUg49XR7CAqCgoqKMidKSAgICAqKtTeySAxNTDjIMjH4crM49ogx+HOx+PTIMjH 4c3sIMfhy8fhyyDIzObH0SDj08zPIN3H2OPJCsfh1NHIyuHsKirj08fNySAxNTDjINrIx9HlINrk IDPk5uMg5jPR08jU5CDmMs3jx+Mg5iDj2MjOIObI4d/m5CDK1NjtyArdx87RINrh7CDmx8zl5QrI zdHsIObNz+3eySDm2uHsINTH0dog2tHW5TUw4yDm2+3RIOPM0ebNySDk5cfG7CDH4dPa0SDH4ePY 4ebIIDI1MDDM5O3lIOPV0ewKKioqCgoqKMwpKirh0cfbyOwgx+HT3+Qgx+Hdx87RINTeySDH0dbs IMjNz+3eySDO4d0g3eTP3iDH4ePt0cfMIMjH4crM49oqKiDU3skK3sfk5uQgzM/tzyDIx+Hex+XR ySDH4czP7c/JIMfR1uwg49HK3dogyM3P7d7JIM7H1ckg49PHzckgMzAw4yDayMfR5SDa5CA029Hd CuYz0dPI1OQg5jLN48fjIObj2MjOIObK1NjtyCDT7dHH4+3fIN3HztEg5sjlxyDK4e3d5uQgx+HT 2tEgx+Hj2OHmyCAzNTAwzOTt5Qrj1dHsICoKCioozykqKiAqKt3t4ccgz+bI4d/TINHHxtrJIMjN z+3eySDOx9XJIMjH4crM49ogx+HOx+PTIOHhx+3Mx9Eg3sfk5uQKzM/tzyoq3e3hxyDR5trJIMfR 1uwg49PHzckgMjUw4yDayMfR5SDa5CAz5ObjIOYz0dPI1OQg5jPN48fjIObj2MjOCubI4d/m5CDK 1NjtyArRzsfjIObT7dHH4+3fIObI5ccgx+Hm4+3Kx+Egx+HT2tEgx+Hj2OHmyCA0MDAwzOTt5SDj 1dHsICoKCioo5SkqKt3t4ccg49PK3uHJIDM1MOMgyMfh1ebRIOTH1e3JINrh7CDUx9HaIMfhytPa 7eQgx+HRxu3T7CDIx+HKzOPaIMfhzsfj0yoKKiDd7eHHIMjj5t7aIOHkIO3K39HRIN7H5ObkIMzP 7c8g2uHsIOTH1e3JINTH0drt5CDRxu3T7e3kIMjH4crM49ogx+HOx+PTCuPH0sfhyiDKzcogx+HK 1NjtyCDayMfR5SDa5CA05ObjIOY00dPI1OQg5jPN48fjIObj2MjOIOYyyOHf5uQgKgoKKijmKSoq ICoq3e3hxyDj08re4ckgx+PH4yDjz8fR0yDHzuTHyubkIMjH4crM49ogx+HOx+PTIOHhx+3Mx9Eg 3sfk5uQgzM/tKirPCuPm3trlxyDj1OXmINHMz8cg4+Qgx9He7CDj5sfe2iDIx+HKzOPaIMfhzsfj 0yDj08fNyuXHIDYwMOMg2sjH0eUg2uQgyM/R5uMK5sfR1uwg5sfm4SDm0ebm3SoKCirH4drR1jE2 OioqICAqKtTeySAxMTDjIN7H5ObkIMzP7c8gyMfh497Y4yoqICoKCirh4cftzMfRIN7H5ObkIMzP 7c8g1N7JIMjH4ePe2OMgyMfh5dbIySDH4ebT2Owgz+bR08fP0yDj08fNySAxMTDjINrIx9HJINrk CjLk5uMg5jLR08jU5CDmzePH4yDm49jIziDmyOHf5uQgytTY7cgg38fj4SDm7czPIMzRx8wgzsfV IMjlxyDH4dPa0SDH4ePY4ebICjExMDDM5O3lIOPV0ewgKgoKKsfh2tHWMTc6KiogICAqKt3t4ccg yOPRyNogx+Hm0sfRwSDIx+HU7dHHyubkIMjH5ObRx+PHINrh7CDN48fjINPIx83JKiogKgoKKuHh x+3Mx9Eg3sfk5uQgzM/tzyDd7eHHIMjH4c/m0SDH4dHHyNogyNTH0dog4+bH0uwg4d3t4ccg4+Tt 0SDLx8jKCsjH4dTt0cfK5uQg49PHzckzNTDjINrIx9HlINrkIDPk5uMg5jTR08jU5CDmM83jx+Mg 5uPYyM4g5sjh3+bkIObf4SDb0d3JIOHlxwrN48fjIM7H1SDI5ccg5srU2O3I5ccgyMfR3+3lIObT 7dHH4+3fIObI5ccg49jIziDH0eYg5s/t3+bRx8og2uHsIMfa4ewg49PK5uwK5sfh09/kINHH3uwg 5dDHIMfh4+be2iDh0ObsIMfh3c7H48kgx+HT2tEgx+Hj2OHmyCA5MDAwzOTt5SDj1dHsICoKKgoK 5eTHIOPN4cfKIMjU5sfR2iDKzMfR7ckg4+Qgx+HP0czJIMfhx+bh7CAg5uPmx97aIOTHz9HJIOHM 4+3aIMfhx9vRx9Yg4eHI7doKx+Ygx+HH7czH0SDI49PHzcfKIObH48ff5CDjyt3R3skgyOPV0SDj 5OXHIMjH4dXm0QoKCgrH4drR1jE6ICDjzeEg4eHI7dogx+Ygx+HH7czH0SDd7CDj1dEgx+HMz+3P ySDI4+be2iDkx8/R5uHe2MkgyOPtz8fkCsfhx9Pjx9rt4e3JINrh7CDUx9HaINHG7dPsIO3V4c0g 4cjk5t8gLSDK5t/t4cfKIMfN0O3JLSDK5t/t4cfKIOPYx9rjLQrK5t/t4cfKIOPN4+bhIOPTx83J IDcw4yDIx9HK3cfaIDQuNSDjytEg5uPTysjazyDk1MfYINXtz+HtySDH4crax97PIN3sIM3H4ckK x+HH7czH0SDj2OHmyCA21OXm0SDj3s/jIObH4ePP5SDH4cftzMfR7ck10+Tmx8og5sfhx+3Mx9Eg x+Hj2OHmyCAyMsfh3SDM5O3lCuPV0ewKCubd7CDNx+HJIMfhyO3aIMfh48rRINrh7CAyOMfh3SDM 5O3lIOPV0ewgIMfsIMfhx8zjx+HsIDE5NjAwMDDH4d0gzOTt5SDj1dHsCgoKCsfh2tHWMjogICDj zeHt5CDd0dXJIOHe2MkgyNrt5CDU49MgyMfI0cfl7eMg2sjPIMfh0cfS3iDH4dHG7dPsIM3tyyDH 4d/Lx93JCsfh09/H5O3JIMfh2sfh7ckg5tTl0crlIMfhyszH0e3JIOPkIMfhz9HMySDH4cfm4ewg IOHhyO3aIMfmIMfhx+3Mx9Eg49PHzckKx+HH5uEgNjDjIObH4cvH5OwgOTDjIObl5MffIMfj38fk 7eUg3crN5eMg2uHsIMja1iDa4ewgx+HY5sggx+HHzePRINrR1grH4dTH0dogMjDjIMjl4yDM4+3a IMfh49HH3d4gytHO7dUgx+HjzeHHyiDKzMfR7CDj5CDH4c3sIObt5szPIMzj7dogx+Hj5sfV4cfK Cubt5szPIMrT5e3hx8og3ewgx+HTz8fPCgoKCgoKx+Ha0dYzOiAgINPmyNEg48fR38ogMTcw4yDI x+Hj0e3m2O3JINrh7CDUx9Ha7eQg5uXmINTbx+Egzcfh7ccKCgoKCgrH4drR1jQ6ICAg483hx8og yOPmx97aIOHe2MkgyOPV0SDH4d7P7ePJIOPm3togyszH0ewg0cfG2iDIzObH0SDjzdjJIOPK0eYK 48fR7CDM0czTIObIzObH0SDH4d/m0eTt1CDm3tPjIOPV0SDH4d7P7ePJIOHhyO3aIMfmIOHhx+3M x9EKCjFfIOPN4SDj08fNyuUgNjDjIMrU2O3IINPmyNEg4ebf0yDH0dbtx8og5s3mx8bYINPt0cfj 7d8g5tXhx8og5t/Ux93HygoKMl8g7ebMzyDH7dbHIOPN4cfKIOPkIDE1x+HsIDEyMOMgyM/m5CDK 1NjtyCDH7dbHIMjk3dMgx+Hj5t7aIMfhyszH0ewg5dDHCgozXyDIz9Hm4yAzMDDjIMfR1u3HyiDN 1e3RySDO0dPH5O3JIObN5sfG2CDK5ebtySDj5CA05szlx8og3uPt1SDO0dPH5Owg7dXhzQrjztLk IMfmIOPV5NoKCgoKCgogICDH4drR1jU6ICAg483hIMjT5MrRIMfh48/t5MkgIMjH4ePR39Igx+Ha x+Hj7CAg4+be2iDjyuPt0iDIx+Hax9TRIOPkINHj1sfkCsjM5sfRIMfh4+be3SDmx+HI5ObfIMjj 2uTsIMfk5SAg4+be2iDKzMfR7CDm5eYgyMfhz+bRIMfhysfhyiDmx+3WxyDIzObH0QrH4dPh4yDm x+HH08fk0+3RINnH5dEgzM/HIOPTx83K5SAzMdI14yDOx+HVIMfhy+PkIObI483W0SDH4cfTyuHH 4yDm2t7PIOTlx8bsCtvt0SDjzc/PIMfh5NTH2CDH4cjHyCDNz+3PIObH4dTIx8jt3yDI2tHWIMfh 483hIMjH4cfh5uPtysfhIObjz+Xm5CDI4cfTyu3fCsfI7dYKCsfjxyDH4dPa0SDd5eYg4d7YySA1 MMfh3SDM5O3lIOPV0ewKCgoKx+Ha0dY2OiAgIOPN4SDI4+be2iDH08rL48fR7CDh4cjt2iDIx+Ha yOYg0SDO4d0gx8jmINDf0ewgyNPkytEgx9PKy+PH0ewg4+QKx+HP0czJIMfhx+bh7AoKIOPex8jh IOPV4c3JIMfh0OXIIMfhzM/tz8kgyMfhzewgx+HH5uEgyMfhz+bRIMfhx9HW7CDmx8zl5QoKx+HT 2tEgx+Hj2OHmyCAxNjDH4d0gzOTt5SDj1dHsIN/H1CDm4+Pf5CDK0+Xt4cfKICDI09rRIDE4MMfh 3SDM5O3lIOPV0ewKCgoKCgrH4drR1jc6ICAg483hIDEyMOMgyszH0ewgzM/Hx8fHx8fHINrh7CDU x9HaINHG7dPsICDI4+be2iDRx97sIMzPxwrIx+Hhx9Pf5M/R7ckKCgoKCgrH4drR1jg6ICAgIOPN 4SDIx+HU7c4g0sftzyAyMDAwIMfjx+Mg4+TKzNogx+HM5uPH5OUKCgrj08fNySA0MOMgys7V7dUg ztbH0SDm3cff5eUg5uPj3+Qgytvt0SDH4eTUx9ggzdPIIMfh48rHzSDj5CDeyOEgx+HM5cfSCgrH 4ePP3dogNznH4d0gzOTt5SDj1dHsIObj2OHmyCA2Msfh3SDT5ObtxyDa4ewgOcfe08fYIMfsIDnT 5ObHyiDH5uEg3tPYIO3Tys3eCt3sIDQvMTIvMjAwOObH4ePY4ebIIDQwx+HdIMfm3dEgyMfhx9bH 3ckgx+HsIMfh48jh2yDH4dDsIMrjIM/d2uUg4+Qg3sjhCuHhzOXH0iDm7ebMzyDH49/H5O3lIMfh yt7T7dgg2uHsIDExON7T2CDH7CAxONPk5SDIz+HHIOPkIDnT5ObHygoKCgrH4drR1iA5OiAgIOPe 0SDj08fNyuUgMTgwMOMgyOPk2N7JIM3h5sfkIMfh0cbt0+3JIM3tyyDH4d/Lx93JIMfh09/H5O3J Csfh2sfh7ckKCsjH4d7RyCDj5CDjytHmIMfhx+Tdx94g5uPm3t0gx+HHyubI7dMg5sfh0dPd7dMg 5uPkIMzj7dogx+Hax+Ph7eQgyOPVx+TaCs3h5sfkIOPj3+Qg2uPh5ccg49PK1N3sIMfmIOPR39Ig 2MjsIOPK38fj4SDI5NnH4yDH4ePUx9HfySDm5eTH3yDhxyDt5szPCuPTytTd7CDH5iDj0d/SINjI 7CDI5N3TIMfh49PHzckg5u3j3+Qg2uPhINXtz+HtySDPx87h7ckg4eHj08rU3ewg4c7P48kK0ebH z+XHIOPe0+PlINrh7CDP5tHt5CDH5uEgIObKx+TsIObf4SDj5OXjIDkwMOMgyMfhx9bH3eUg4eHH 0dbsIDQ1MOMg49oKx+Pfx+Tt5SDa4+Eg48/O4SDOx9UKCtjR7d7JIMfh08/HzyDd7CDNx+HlIMfh yO3aIMjH4cre0+3YIObd7CDNx+Egx+Hj1MfR38kg7d/m5CDkzeQgyMfh49/H5ArmzdbRyt/jIMjH 4crM5e3Sx8og5sfhx8/H0ckg49og5szmzyDk2cfjIOPNx9PI7CDjyt/H4+Egx+HH0cjHzSDYyN7H IOHh5NPICsfhyuwg7crjIMfhx8rdx94g2uHt5ccKCgoK4eHj2sft5OUg7dHM7CDH4cfK1cfhINrh 7CDR3uMgx+Hlx8rdIMfmIMfh49HH0+HJINrI0SDH4cft4+3hCjAxMDMwNDM2ODIKKgoKKm1hc2th bm1hc3J5QGdtYWlsLmNvbSoKCirh2s/jIMrh3uwgx+wg0dPHxuEg4+Qg5dDHIMfh5ObaIO3RzOwg x9HTx+Eg08fh5SDOx+Ht5SDa4ewg5dDHIMfhx+3j7eEqCgoqU296YW4xZWd5cHRAZ21haWwuY29t KgoKKubH0Mcg38fkIOHP7d/jINrR1iDU3skgLePe0S3d7eHHKiotIOPV5NogliDV7c/h7ckt487S 5C3jzeHH5iDH7CDH1ebhCsfO0ewqKuHhx+3Mx9Egx+Yg4eHI7dog7ePf5N/jIMfR08fhIMrdx9Xt 4SDH4drR1iDfx+PhxyDm7d3W4SDmzObPINXm0QrH5CDH49/kINrh7Arl0Mcgx+HH7ePt4SoqKgoK Km1hc2thbm1hc3J5QGdtYWlsLmNvbSoKCirmx9DHIN/H5CDH4drR1iDH4ePR0+Eg2+3RIOPkx9PI IO3RzOwgx9HTx+Eg2OHI3+Mg2uHsIOXQxyDH4cft4+3hKgoKKkhhbmFuMWVneXB0QGdtYWlsLmNv bSAqCgoq49ogys3tx8ogKgoKKuPT3+Qg49XR7CoKCip3d3cubWFza2FubWFzcnkuY29tKgo= ------=_Part_144361_12721996.1231106966208 Content-Type: text/html; charset=WINDOWS-1256 Content-Transfer-Encoding: base64 Content-Disposition: inline PGJyPjxzcGFuIGNsYXNzPSJnbWFpbF9xdW90ZSI+PGJyPjwvc3Bhbj4KPGRpdj48c3BhbiBjbGFz cz0iZSIgaWQ9InFfMTFlYTNiMGJiZWEzYTkxZV8wIj48YnI+PGJyPjxicj48YnI+PHNwYW4gY2xh c3M9ImdtYWlsX3F1b3RlIj4KPGRpdiBhbGlnbj0iY2VudGVyIj48c3Ryb25nPjxmb250IGNvbG9y PSIjMzMzM2ZmIiBzaXplPSI0Ij7I0+Mgx+Hh5SDH4dHN4+Qgx+HRze3jPC9mb250Pjwvc3Ryb25n PjwvZGl2Pgo8ZGl2IGFsaWduPSJjZW50ZXIiPgo8ZGl2PjxzdHJvbmc+PGZvbnQgY29sb3I9IiMz MzMzZmYiPjxmb250IHNpemU9IjQiPszH0ewgx+HHyt3H3iZuYnNwO+HK5t7t2iDI0crm3+bhIMra x+bkIMjt5CDj09/kIOPV0ewg5sfNz+wg1NHfx8ogx+HK4+bt4SDH4drex9HsIOHK7dPt7dEgx+HO z+PHyiA8c3BhbiBuYW1lPSJzdCI+x+Ha3sfR7ck8L3NwYW4+PC9mb250PjwvZm9udD48L3N0cm9u Zz48L2Rpdj4KPGRpdj48c3Ryb25nPjxmb250IGNvbG9yPSIjMzMzM2ZmIiBzaXplPSI0Ij7m2uHs IMfh08fPySDH4ePUytHt7eQg4+Qg49XRIMfR08fhIMfhyO3H5MfKIMfh48fh7ckg4eHPzuEgx+HR 0+PsINPmx8Eg3tjH2iDax+Mgx+YgzsfVIObf0OHfIMfh48jh2yA8L2ZvbnQ+PC9zdHJvbmc+PC9k aXY+CjxkaXY+PHN0cm9uZz48Zm9udCBjb2xvcj0iIzMzMzNmZiIgc2l6ZT0iNCI+x+Hjyubd0SDN x+HtxyDh4dTRx8EgKO3K4yDP3dog4+QgMTAl4+Qgy+PkIMfh5s3PySDmx+HIx97sIO3K4yDP3drJ IOPkINTR38kgx+HK4+bt4SDIzuHH4SDH08jm2iDh4cjHxtombmJzcDsg5u3K4yDK3tPt2OUgx+Ht 3+Mg4ePP5SDK1eEgx+HsJm5ic3A7MjDT5Mkp5t3sIM3H4SDH4drj4SDOx9HMIOPV0SDtyuMgx83W x9Eg1OXHz8kg4cfLyMfKIMfhz87hIObj5sveySDj5CDH4d7k1eHtySDH4ePV0e3JPC9mb250Pjwv c3Ryb25nPjwvZGl2PgoKPGRpdj48c3Ryb25nPjxmb250IGNvbG9yPSIjMzMzM2ZmIiBzaXplPSI0 Ij7t0czsIMfR08fhIMfhyO3H5MfKIMfhzdPHyO3JIOPkIMfhz87hIObaz88gx+HT5ObHyiDh4cre 0+3YIObH4ePI4dsgx+HjysfNIObj5sfV3cfKIMfh5s3PySDH4ePY4ebI5SDH4ewg5dDHIMfhx+3j 7eEgPC9mb250Pjwvc3Ryb25nPjwvZGl2Pgo8ZGl2PjxhIG9uY2xpY2s9InJldHVybiB0b3AuanMu T3BlbkV4dExpbmsod2luZG93LGV2ZW50LHRoaXMpIiBocmVmPSJtYWlsdG86bW9uYTFlZ3lwdEBn bWFpbC5jb20iIHRhcmdldD0iX2JsYW5rIj48c3Ryb25nPjxmb250IGNvbG9yPSIjMzMzM2ZmIiBz aXplPSI0Ij5tb25hMWVneXB0QGdtYWlsLmNvbTwvZm9udD48L3N0cm9uZz48L2E+PC9kaXY+Cjxk aXY+PHN0cm9uZz48Zm9udCBjb2xvcj0iIzMzMzNmZiIgc2l6ZT0iNCI+Jm5ic3A75trh7CDH4dPH z8kgx+HIx8ba7eQg4eHmzc/HyiDH4ePTzOHJIMfmIMfhyuwg4eXHIMfj38fk7ckgx+HK08zt4SDH 0dPH4SDH4cjtx+THyiDfx+PhySDm7d3W4SDj2iDR0+bjx8og5eTP0+3JIObV5tEg4eHa3sfRIObH 4ebNz8k8L2ZvbnQ+PC9zdHJvbmc+PC9kaXY+CjxkaXY+PHN0cm9uZz48Zm9udCBjb2xvcj0iIzMz MzNmZiIgc2l6ZT0iNCI+5u3K4yDH4cjt2iDIz93aIDEwJebH4cjH3uwmbmJzcDvI1O3fIOPeyObh IMfhz93aJm5ic3A7yM7hx+Egx9PI5tog4+Qg1NHfySDH4crj5u3hPC9mb250Pjwvc3Ryb25nPjwv ZGl2Pgo8ZGl2PjxzdHJvbmc+PGZvbnQgY29sb3I9IiMzMzMzZmYiIHNpemU9IjQiPubt0czsIMfh x9HTx+Eg2uHsIOXQxyDH4cft4+3hIDwvZm9udD48L3N0cm9uZz48L2Rpdj4KPGRpdj48YSBvbmNs aWNrPSJyZXR1cm4gdG9wLmpzLk9wZW5FeHRMaW5rKHdpbmRvdyxldmVudCx0aGlzKSIgaHJlZj0i bWFpbHRvOm1vaGFtZWRtb2hzZW4xZWd5cHRAZ21haWwuY29tIiB0YXJnZXQ9Il9ibGFuayI+PHN0 cm9uZz48Zm9udCBjb2xvcj0iIzMzMzNmZiIgc2l6ZT0iNCI+bW9oYW1lZG1vaHNlbjFlZ3lwdEBn bWFpbC5jb208L2ZvbnQ+PC9zdHJvbmc+PC9hPjwvZGl2Pgo8ZGl2Pjxicj4mbmJzcDs8L2Rpdj48 L2Rpdj48YnI+PC9zcGFuPgo8cCBzdHlsZT0iTUFSR0lOOiAwaW4gMGluIDBwdCI+PGI+PHNwYW4g bGFuZz0iQVItRUciIGRpcj0icnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogcmVk Ij48Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iIHNpemU9IjQiPuXkxyDt5szPINTe3iDh3tjJ IObR5trJIMjH4ePax8/sIObH4crM49og5t3t1eEg5szT0SDH4dPm7dMg5sfh5NLlySDm0sftzyDm x+HU0ebeIObH4drI5tEg5uPP7eTK7CDm4+TlxyDIx+HV5tEgPC9mb250Pjwvc3Bhbj48L2I+PC9w PgoKPHAgc3R5bGU9Ik1BUkdJTjogMGluIDBpbiAwcHQiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9 InJ0bCIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj48c3Bhbj4m bmJzcDs8L3NwYW4+PC9zcGFuPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBkaXI9InJ0bCIgc3R5bGU9 IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICMzMzY2ZmY7IEZPTlQtRkFNSUxZOiBBcmlhbCI+x+Ha 0dYxOjwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItU0EiIGRpcj0icnRsIiBzdHlsZT0iRk9O VC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogQXJpYWwiPjxzcGFuPiZuYnNwOyZuYnNwOyA8L3Nw YW4+PHNwYW4gc3R5bGU9IkNPTE9SOiBmdWNoc2lhIj7hz+bH2u0gx+HT3dEg1N7JICZuYnNwO93R 1ckgyMfh49rHz+0gyMPR3u0gx+Hj5sfe2jwvc3Bhbj4g49PHzcrlxyAxMDUg4zIgyMPI0cfMIMjt ytTmIMPj7dHt38fkINPtyu0gx+Hj2sfP7SDK1NjtyCDT5sjRIOHm39MgliDH08o8c3BhbiBuYW1l PSJzdCI+4cc8L3NwYW4+4yDd5tHtIJYg2t7PIMjt2iDk5cfG7SDmPHNwYW4gbmFtZT0ic3QiPuHH PC9zcGFuPiDK5szPINrh7eXHIMPtySDD3tPH2CDm48/d5togx8rNx88gx+HjPHNwYW4gbmFtZT0i c3QiPuHHPC9zcGFuPt8g5uPV0ebdx8ogx+Hj0cfd3iDIx+HP5tEgx+HTx8/TIN3tIMjRzDExIM/m 0SDIx+HD08fk0+3RIOPkIDUyIMjRzCDm49PMzyDm48/R08kg5uPm4SDK0d3t5e0g5srMx9HtIMjH 4d7RyCDj5CDfx9Hd5tEg5uTHz+0gx+HV7c8gx+HMz+3PIObkx8/tIObHz+0gz8zhySDT2tEgx+Hj ytEyMzAwIMzk7eUg49XR7DxzcGFuPiZuYnNwOyA8L3NwYW4+yMrT5e08c3BhbiBuYW1lPSJzdCI+ 4cc8L3NwYW4+yiZuYnNwOyDH4dPa0SDUx+PhIMfKzcfPIMfh4zxzcGFuIG5hbWU9InN0Ij7hxzwv c3Bhbj7fIObH4ePRx93eIObH4cPTx+TT7dE8L3NwYW4+PC9iPjwvcD4KCjxwIHN0eWxlPSJNQVJH SU46IDBpbiAwaW4gMHB0Ij48Yj48c3BhbiBsYW5nPSJBUi1TQSIgZGlyPSJydGwiIHN0eWxlPSJG T05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+X19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXzwvc3Bhbj48L2I+PC9wPgo8cCBzdHlsZT0iTUFSR0lOOiAwaW4gMGluIDBw dCI+PGI+PHNwYW4gbGFuZz0iQVItU0EiIGRpcj0icnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0 OyBGT05ULUZBTUlMWTogQXJpYWwiPiZuYnNwOzwvc3Bhbj48L2I+PC9wPgo8ZGl2IHN0eWxlPSJC T1JERVItUklHSFQ6IG1lZGl1bSBub25lOyBQQURESU5HLVJJR0hUOiAwaW47IEJPUkRFUi1UT1A6 IG1lZGl1bSBub25lOyBQQURESU5HLUxFRlQ6IDBpbjsgUEFERElORy1CT1RUT006IDFwdDsgQk9S REVSLUxFRlQ6IG1lZGl1bSBub25lOyBQQURESU5HLVRPUDogMGluOyBCT1JERVItQk9UVE9NOiB3 aW5kb3d0ZXh0IDEuNXB0IHNvbGlkIj4KPHAgc3R5bGU9IkJPUkRFUi1SSUdIVDogbWVkaXVtIG5v bmU7IFBBRERJTkctUklHSFQ6IDBpbjsgQk9SREVSLVRPUDogbWVkaXVtIG5vbmU7IFBBRERJTkct TEVGVDogMGluOyBQQURESU5HLUJPVFRPTTogMGluOyBNQVJHSU46IDBpbiAwaW4gMHB0OyBCT1JE RVItTEVGVDogbWVkaXVtIG5vbmU7IFBBRERJTkctVE9QOiAwaW47IEJPUkRFUi1CT1RUT006IG1l ZGl1bSBub25lIj48Yj48c3BhbiBsYW5nPSJBUi1TQSIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJ WkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PHNwYW4+Jm5ic3A7PC9zcGFuPjxzcGFuIHN0 eWxlPSJDT0xPUjogYmx1ZSI+x+Ha0dYyOjwvc3Bhbj48c3BhbiBzdHlsZT0iQ09MT1I6IGZ1Y2hz aWEiPjxzcGFuPiZuYnNwOyZuYnNwOyA8L3NwYW4+4eHT3+Qgx+Hd5tHsIMjj5t7aIOPK4+3SIMjH 4ePax8/sIMjH4d7RyCDj5CDjzdjJIMfh48rR5iDj5NjeySDRx97tyTxzcGFuPiZuYnNwOyA8L3Nw YW4+PC9zcGFuPjwvc3Bhbj48L2I+PHN0cm9uZz48c3BhbiBsYW5nPSJBUi1TQSIgZGlyPSJydGwi IHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiBmdWNoc2lhOyBGT05ULUZBTUlMWTogVGFo b21hIj7U3skgytTY7cgg0+bI0SDh5t/TPC9zcGFuPjwvc3Ryb25nPjxzdHJvbmc+PHNwYW4gbGFu Zz0iQVItU0EiIGRpcj0icnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogIzQ0NDQ0 NDsgRk9OVC1GQU1JTFk6IFRhaG9tYSI+IOPTx83K5ccgMTQwIOPK0SDK2OEg2uHsIOPkx9nRINjI 7drtySDj3crmzckgLiZuYnNwOyDKyt/m5CDj5CDNzNHJIOTm4yDfyO3RySA1IOPK0SDd7CA2IOPK 0SDmzczRySDk5uMgx9Xb0SDm0dPI1OQg5tXH4ckgyubS7dog5s3jx+Mg5sfNzyDm49jIziDm7ePf 5CDH1sfdySDN48fjINXb7dEgLuPY4ebIIDM5NSDH4d0gzOTtySDj1dHsJm5ic3A7KM3mx+HsIDcx IMfh3SDP5jxzcGFuIG5hbWU9InN0Ij7hxzwvc3Bhbj7RIMfj0e3f7CApJm5ic3A74+Pf5CDH4cjt 2iDIyNrWIN7Y2iDHPHNwYW4gbmFtZT0ic3QiPuHHPC9zcGFuPsvHyyDm49/t3cfKIMfh5ebHwSDm 7ebMzyDh5ccg1ebRPC9zcGFuPjwvc3Ryb25nPjwvcD4KPC9kaXY+CjxwIHN0eWxlPSJNQVJHSU46 IDBpbiAwaW4gMHB0Ij48Yj48c3BhbiBsYW5nPSJBUi1TQSIgZGlyPSJydGwiIHN0eWxlPSJGT05U LVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+Jm5ic3A7PC9zcGFuPjwvYj48L3A+Cjxw IHN0eWxlPSJNQVJHSU46IDBpbiAwaW4gMHB0Ij48Yj48c3BhbiBsYW5nPSJBUi1TQSIgZGlyPSJy dGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiBibHVlOyBGT05ULUZBTUlMWTogQXJp YWwiPtrR1jM6PC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1TQSIgZGlyPSJydGwiIHN0eWxl PSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PHNwYW4+Jm5ic3A7Jm5ic3A7 IDwvc3Bhbj48c3BhbiBzdHlsZT0iQ09MT1I6IGZ1Y2hzaWEiPtTeySAxNjXjIMjH4eTS5ckgx+HM z+3PySA8L3NwYW4+PC9zcGFuPjwvYj48L3A+Cgo8ZGl2IHN0eWxlPSJCT1JERVItUklHSFQ6IG1l ZGl1bSBub25lOyBQQURESU5HLVJJR0hUOiAwaW47IEJPUkRFUi1UT1A6IG1lZGl1bSBub25lOyBQ QURESU5HLUxFRlQ6IDBpbjsgUEFERElORy1CT1RUT006IDFwdDsgQk9SREVSLUxFRlQ6IG1lZGl1 bSBub25lOyBQQURESU5HLVRPUDogMGluOyBCT1JERVItQk9UVE9NOiB3aW5kb3d0ZXh0IDEuNXB0 IHNvbGlkIj4KPHAgc3R5bGU9IkJPUkRFUi1SSUdIVDogbWVkaXVtIG5vbmU7IFBBRERJTkctUklH SFQ6IDBpbjsgQk9SREVSLVRPUDogbWVkaXVtIG5vbmU7IFBBRERJTkctTEVGVDogMGluOyBQQURE SU5HLUJPVFRPTTogMGluOyBNQVJHSU46IDBpbiAwaW4gMHB0OyBCT1JERVItTEVGVDogbWVkaXVt IG5vbmU7IFBBRERJTkctVE9QOiAwaW47IEJPUkRFUi1CT1RUT006IG1lZGl1bSBub25lIj48Yj48 c3BhbiBsYW5nPSJBUi1TQSIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQt RkFNSUxZOiBBcmlhbCI+4eHI7dog2uHsIMfh483H0ckg2sjH0ckg2uQgM+Tm4yDmM9HTyNTkIOYy zePH4yDm49jIziDmyOXHIN/l0cjHwSDm2s/Hz+bUyN/JIOPtx+Ug5sfI5sfIIOYy49XazyDO1Mgg 5tje4yDH4ebj7crH4SDH0+bP2+3RIOPM0ebNySDH4dPa0SDj29HsIMzPxyDh4cjt2iDa4ewgMzQw x+HdIMzk7eUg49XR7CA8L3NwYW4+PC9iPjwvcD4KPC9kaXY+CjxwIHN0eWxlPSJNQVJHSU46IDBp biAwaW4gMHB0Ij48Yj48c3BhbiBsYW5nPSJBUi1TQSIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJ WkU6IDEwcHQ7IENPTE9SOiBibHVlOyBGT05ULUZBTUlMWTogQXJpYWwiPtrR1jQ6PC9zcGFuPjwv Yj48Yj48c3BhbiBsYW5nPSJBUi1TQSIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7 IEZPTlQtRkFNSUxZOiBBcmlhbCI+IDxzcGFuIHN0eWxlPSJDT0xPUjogZnVjaHNpYSI+PHNwYW4+ Jm5ic3A7Jm5ic3A7PC9zcGFuPtTeySDP7eHm39MgMTUw4yDO4d0gzc/t3skgyM/RIMjH4eTS5ckg MszT0SDH4dPm7dM8L3NwYW4+PC9zcGFuPjwvYj48L3A+Cgo8cCBzdHlsZT0iTUFSR0lOOiAwaW4g MGluIDBwdCI+PGI+PHNwYW4gbGFuZz0iQVItU0EiIGRpcj0icnRsIiBzdHlsZT0iRk9OVC1TSVpF OiAxMHB0OyBGT05ULUZBTUlMWTogQXJpYWwiPuHhyO3aINTeySDRx8baySDa4ewgx+HT3+Qgx+Hd 5tHsIMjN0e3JIMjH4c/m0SDH4c7H49Mg5u3mzM8g49XazyDH4cjRzCDa4ewg1N7K7eQg5uXmINrU 0ckgx8/mx9EgytTY7cgg0+bI0SDh5t/TIM/t3+bRx8og0cfG2skg5uPPzuEg3cfO0SDIx+HRzsfj IObtzM8g48fK5tEg4eHj7cflIObO0sfkx8og2uHsINTH0dogPC9zcGFuPjwvYj48c3BhbiBkaXI9 Imx0ciI+PC9zcGFuPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0 OyBGT05ULUZBTUlMWTogQXJpYWwiPjxzcGFuIGRpcj0ibHRyIj48L3NwYW4+PHNwYW4+Jm5ic3A7 PC9zcGFuPjxzcGFuIGRpcj0icnRsIj7jyt3R2iDj5CDUx9HaIMfhzuPT7eQgyMzmx9Egx+Hj2uXP IMc8c3BhbiBuYW1lPSJzdCI+4cc8L3NwYW4+0uXR7CDYPHNwYW4gbmFtZT0ic3QiPuHHPC9zcGFu PsbaIMc8c3BhbiBuYW1lPSJzdCI+4cc8L3NwYW4+0uXRIMfh1NHt3SDK1NjtyCDRx8baIObRx97s IObl7CAz29HdIOTm4yDmMs3jx+MgyMfh0c7H4yDH4dPH3tgg5uPYyM4gyMfh0c7H4yDH4c/HxtHs IObR08jU5DPe2NogyM/t3+bRx8og0cfG2uUgPHNwYW4+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48L3Nw YW4+PC9iPjwvcD4KCjxkaXYgc3R5bGU9IkJPUkRFUi1SSUdIVDogbWVkaXVtIG5vbmU7IFBBRERJ TkctUklHSFQ6IDBpbjsgQk9SREVSLVRPUDogbWVkaXVtIG5vbmU7IFBBRERJTkctTEVGVDogMGlu OyBQQURESU5HLUJPVFRPTTogMXB0OyBCT1JERVItTEVGVDogbWVkaXVtIG5vbmU7IFBBRERJTkct VE9QOiAwaW47IEJPUkRFUi1CT1RUT006IHdpbmRvd3RleHQgMS41cHQgc29saWQiPgo8cCBzdHls ZT0iQk9SREVSLVJJR0hUOiBtZWRpdW0gbm9uZTsgUEFERElORy1SSUdIVDogMGluOyBCT1JERVIt VE9QOiBtZWRpdW0gbm9uZTsgUEFERElORy1MRUZUOiAwaW47IFBBRERJTkctQk9UVE9NOiAwaW47 IE1BUkdJTjogMGluIDBpbiAwcHQ7IEJPUkRFUi1MRUZUOiBtZWRpdW0gbm9uZTsgUEFERElORy1U T1A6IDBpbjsgQk9SREVSLUJPVFRPTTogbWVkaXVtIG5vbmUiPjxiPjxzcGFuIGxhbmc9IkFSLVNB IiBkaXI9InJ0bCIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj4m bmJzcDs8L3NwYW4+PC9iPjwvcD4KPC9kaXY+CjxwIHN0eWxlPSJNQVJHSU46IDBpbiAwaW4gMHB0 Ij48Yj48c3BhbiBsYW5nPSJBUi1TQSIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7 IEZPTlQtRkFNSUxZOiBBcmlhbCI+Jm5ic3A7PC9zcGFuPjwvYj48L3A+CjxwIHN0eWxlPSJNQVJH SU46IDBpbiAwaW4gMHB0Ij48Yj48c3BhbiBsYW5nPSJBUi1TQSIgZGlyPSJydGwiIHN0eWxlPSJG T05ULVNJWkU6IDEwcHQ7IENPTE9SOiAjMzM2NmZmOyBGT05ULUZBTUlMWTogQXJpYWwiPtrR1jU6 PC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1TQSIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJ WkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PHNwYW4+Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48 c3BhbiBzdHlsZT0iQ09MT1I6IGZ1Y2hzaWEiPtTeySDkx9XtySDH48fjIMjmx8jJIOTHz+wgx+HU 49Mg5t3kz94gx+HTPHNwYW4gbmFtZT0ic3QiPuHHPC9zcGFuPuMgMTUw4yA8L3NwYW4+PC9zcGFu PjwvYj48L3A+Cgo8cCBkaXI9InJ0bCIgc3R5bGU9IkRJUkVDVElPTjogcnRsOyBURVhULUFMSUdO OiByaWdodCI+PGI+PHNwYW4gbGFuZz0iQVItU0EiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZP TlQtRkFNSUxZOiBBcmlhbCI+x+Hd7eYgzNPRIMfh0+bt0yDm3eTP3iDH4dM8c3BhbiBuYW1lPSJz dCI+4cc8L3NwYW4+4yDI1MfR2iDd4dPY7eQgz+bRIM7H49Mg5sfh2t7H0TXHz+bH0ebH0dbsPHNw YW4+Jm5ic3A7IDwvc3Bhbj7ayMfRySDa5CAz5ObjIOY8L3NwYW4+PC9iPjxiPjxzcGFuIGxhbmc9 IkFSLUVHIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogbmF2eTsgRk9OVC1GQU1JTFk6 IEFyaWFsIj4g49PHzckgx+Hb0d0gMTYg4yAyIJYgMTQg4zIgliAyMCDjMiA8c3Bhbj4mbmJzcDs8 L3NwYW4+5iDj08fNySDH4dHt08jU5CDH4cPM48fh7ckgNDAg4zI8c3Bhbj4mbmJzcDsgPC9zcGFu PuYg49PHzckgx+HN48fjIMfh38jt0SA2IOMyJm5ic3A7Jm5ic3A7IObH4dXb7dEgMiDjMiZuYnNw OyZuYnNwOyDH4ePYyM4mbmJzcDsgNyDjMjxzcGFuPiZuYnNwOyA8L3NwYW4+49PHzckgx+HY0d7J IMfh4+bM5s/JIMjt5CDH4dvR3crt5CDH4c/HzuHtyu3kIObH4c3jx+Pt5CDmx+Hj2MjOIMrTx+bt IDYg4zIgPC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZPTlQtU0laRTog MTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj48L3NwYW4+PC9iPjwvcD4KCjxkaXYgc3R5bGU9IkJP UkRFUi1SSUdIVDogbWVkaXVtIG5vbmU7IFBBRERJTkctUklHSFQ6IDBpbjsgQk9SREVSLVRPUDog bWVkaXVtIG5vbmU7IFBBRERJTkctTEVGVDogMGluOyBQQURESU5HLUJPVFRPTTogMXB0OyBCT1JE RVItTEVGVDogbWVkaXVtIG5vbmU7IFBBRERJTkctVE9QOiAwaW47IEJPUkRFUi1CT1RUT006IHdp bmRvd3RleHQgMS41cHQgc29saWQiPgo8cCBkaXI9InJ0bCIgc3R5bGU9IkJPUkRFUi1SSUdIVDog bWVkaXVtIG5vbmU7IFBBRERJTkctUklHSFQ6IDBpbjsgQk9SREVSLVRPUDogbWVkaXVtIG5vbmU7 IFBBRERJTkctTEVGVDogMGluOyBQQURESU5HLUJPVFRPTTogMGluOyBCT1JERVItTEVGVDogbWVk aXVtIG5vbmU7IERJUkVDVElPTjogcnRsOyBQQURESU5HLVRPUDogMGluOyBCT1JERVItQk9UVE9N OiBtZWRpdW0gbm9uZTsgVEVYVC1BTElHTjogcmlnaHQiPgo8Yj48c3BhbiBsYW5nPSJBUi1FRyIg c3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6IG5hdnk7IEZPTlQtRkFNSUxZOiBBcmlhbCI+ 49PHzckgx8zjx+HtySDh4cjh3+bkySAyMCDjMiA8c3Bhbj4mbmJzcDs8L3NwYW4+ytTY7cgg0+bI 0SDh5t/TINPt0cfj7d8g2s/HIDLb0d3JIOTm4yDIx9Hf7eUg5trez+XHINXNySDK5t7t2iDj5CDH 4ePH4d8gxzxzcGFuIG5hbWU9InN0Ij7hxzwvc3Bhbj7V4ewg4eHU3sk8c3Bhbj4mbmJzcDsgPC9z cGFuPubH4dPa0SDH4ePY4ebIIOHhyO3aIDIyNTDM5O3lIOPV0ewg4eHjytEgPC9zcGFuPjwvYj48 L3A+CjwvZGl2Pgo8cCBkaXI9InJ0bCIgc3R5bGU9IkRJUkVDVElPTjogcnRsOyBURVhULUFMSUdO OiByaWdodCI+PGI+PHNwYW4gbGFuZz0iQVItRUciIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZP TlQtRkFNSUxZOiBBcmlhbCI+PHNwYW4+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48L2I+PGI+PHNwYW4g bGFuZz0iQVItU0EiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiBibHVlOyBGT05ULUZB TUlMWTogQXJpYWwiPtrR1jY6PC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9 IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj48c3Bhbj4mbmJzcDsmbmJzcDsg PC9zcGFuPjxzcGFuIHN0eWxlPSJDT0xPUjogZnVjaHNpYSI+1N7JIOTH1e3JIMjd7TxzcGFuIG5h bWU9InN0Ij7hxzwvc3Bhbj4gyMfhyszj2iDH4c7H49Mgx+HNz+3eySDH4d3t5iDa4ewgzc/t3sk8 c3Bhbj4mbmJzcDsgPC9zcGFuPubj5CDM5eUgx87R7CDa4ewgx+Hj2uXPIMfh2sfh7CDh4drh5uMg xzxzcGFuIG5hbWU9InN0Ij7hxzwvc3Bhbj7Px9HtySA8L3NwYW4+PC9zcGFuPjwvYj48L3A+Cgo8 ZGl2IHN0eWxlPSJCT1JERVItUklHSFQ6IG1lZGl1bSBub25lOyBQQURESU5HLVJJR0hUOiAwaW47 IEJPUkRFUi1UT1A6IG1lZGl1bSBub25lOyBQQURESU5HLUxFRlQ6IDBpbjsgUEFERElORy1CT1RU T006IDFwdDsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25lOyBQQURESU5HLVRPUDogMGluOyBCT1JE RVItQk9UVE9NOiB3aW5kb3d0ZXh0IDEuNXB0IHNvbGlkIj4KPHAgZGlyPSJydGwiIHN0eWxlPSJC T1JERVItUklHSFQ6IG1lZGl1bSBub25lOyBQQURESU5HLVJJR0hUOiAwaW47IEJPUkRFUi1UT1A6 IG1lZGl1bSBub25lOyBQQURESU5HLUxFRlQ6IDBpbjsgUEFERElORy1CT1RUT006IDBpbjsgQk9S REVSLUxFRlQ6IG1lZGl1bSBub25lOyBESVJFQ1RJT046IHJ0bDsgUEFERElORy1UT1A6IDBpbjsg Qk9SREVSLUJPVFRPTTogbWVkaXVtIG5vbmU7IFRFWFQtQUxJR046IHJpZ2h0Ij4KPGI+PHNwYW4g bGFuZz0iQVItU0EiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+ 4eHI7dog1N7JIDIwMOMgyMfhyszj2iDH4c7H49Mgx+HN7CDH4crH4cog2sjH0eUg2uQgM+Tm4yDm NNHTyNTkIOYyzePH4yDm49jIziDmyOHf5uTlIObl7CDOx+HVySDH2uPH4SDH4eTMx9HJIObH4dPI x9/JIObH4d/l0cjHwSDmx+HP5cfkx8og7eTe1eXHIMfh0+3Rx+Pt3yDH4dPa0SDH4ePY4ebIIDYw MMfh3SDM5O3lIOPV0ewgPC9zcGFuPjwvYj48L3A+CjwvZGl2Pgo8cCBkaXI9InJ0bCIgc3R5bGU9 IkRJUkVDVElPTjogcnRsOyBURVhULUFMSUdOOiByaWdodCI+PGI+PHNwYW4gbGFuZz0iQVItU0Ei IHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiBibHVlOyBGT05ULUZBTUlMWTogQXJpYWwi PtrR1jc6PC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZPTlQtU0laRTog MTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj48c3Bhbj4mbmJzcDsmbmJzcDsgPC9zcGFuPjxzcGFu IHN0eWxlPSJDT0xPUjogZnVjaHNpYSI+1N7JIDEzNeMgyMfk5tHH48cg2uHsIM3P7d7JIN/I7dHJ IMjH4crM49ogx+HLx+HLIOPm3tog48rj7dIgzM/Hx8fHPC9zcGFuPjwvc3Bhbj48L2I+PC9wPgoK PHAgZGlyPSJydGwiIHN0eWxlPSJESVJFQ1RJT046IHJ0bDsgVEVYVC1BTElHTjogcmlnaHQiPjxi PjxzcGFuIGxhbmc9IkFSLVNBIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTog QXJpYWwiPuHhyO3aINTeySDIx9Pfx+Qgx+HUyMfIIMc8c3BhbiBuYW1lPSJzdCI+4cc8L3NwYW4+ 08rL48fR7CDI4+be2iDj4+3SINrIx9HlINrkIDPk5uMg5jLR08jU5CDmMs3jx+Mg5uPYyM4g49PH zckg1cfd7ckgyM/m5CDj5Mfm0SDIx+HP5tEgx+HRx8jaIObH4drex9EgM8fP5sfRIObH0dbsIObI 5ccg28fSINjI7drsIMzj7dogx+Hb0d0g5sfhzePH48fKIObH4ePYyM4gytjhINrh7CDH4dTH0dog 5sfhzc/t3skg5u3mzM8gx+HV5tEgx+HOx9XJIMjH4dTeySDmx+Hd7eYgx+PHIObV3SDHPHNwYW4g bmFtZT0ic3QiPuHHPC9zcGFuPsvHyzwvc3Bhbj48L2I+PC9wPgoKPGRpdiBzdHlsZT0iQk9SREVS LVJJR0hUOiBtZWRpdW0gbm9uZTsgUEFERElORy1SSUdIVDogMGluOyBCT1JERVItVE9QOiBtZWRp dW0gbm9uZTsgUEFERElORy1MRUZUOiAwaW47IFBBRERJTkctQk9UVE9NOiAxcHQ7IE1BUkdJTi1M RUZUOiAwaW47IEJPUkRFUi1MRUZUOiBtZWRpdW0gbm9uZTsgTUFSR0lOLVJJR0hUOiAwLjI1aW47 IFBBRERJTkctVE9QOiAwaW47IEJPUkRFUi1CT1RUT006IHdpbmRvd3RleHQgMS41cHQgc29saWQi PgoKPHAgZGlyPSJydGwiIHN0eWxlPSJCT1JERVItUklHSFQ6IG1lZGl1bSBub25lOyBQQURESU5H LVJJR0hUOiAwaW47IEJPUkRFUi1UT1A6IG1lZGl1bSBub25lOyBQQURESU5HLUxFRlQ6IDBpbjsg UEFERElORy1CT1RUT006IDBpbjsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25lOyBESVJFQ1RJT046 IHJ0bDsgVEVYVC1JTkRFTlQ6IC0wLjI1aW47IE1BUkdJTi1SSUdIVDogMC4yNWluOyBQQURESU5H LVRPUDogMGluOyBCT1JERVItQk9UVE9NOiBtZWRpdW0gbm9uZTsgVEVYVC1BTElHTjogcmlnaHQi Pgo8Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1J TFk6IEFyaWFsIj7I5ccg29HdySA8L3NwYW4+PC9iPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBzdHls ZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogQXJpYWwiPtvR3ckg5ObjIM7UyCDH0eYg 3ebRIN3m0czt5SDmyOXHINPR7dEgMTcw0+Mg5iDb0d3JIMjlx9rPzyAyIDxzcGFuIHN0eWxlPSJD T0xPUjogIzFmNDk3ZCI+0zwvc3Bhbj7R7dEgMTIwINPjIObP5jxzcGFuIG5hbWU9InN0Ij7hxzwv c3Bhbj7IIMg8c3BhbiBuYW1lPSJzdCI+4cc8L3NwYW4+38fRIM7UyCDH0eYmbmJzcDsg5srRyO3S ySDK4e3d0u3m5CDmINvR3ckg49rt1MkgyOXHIMfkytHt5SAmbmJzcDvfx+TI5SAyIObfx+TI5SAz IObd5srt5SDm49/KyMkgJm5ic3A75srRyO3SySDmINXH4ebkIN/H4+EgyOUg38fkyMkgMyDm38fk yMkgMiDmPHNwYW4gc3R5bGU9IkNPTE9SOiBibGFjayI+Mjwvc3Bhbj7f0dPsJm5ic3A75iDT3dHJ IN/H4+HJIM7UyCDH0eYg5sjlxyDP5jxzcGFuIG5hbWU9InN0Ij7hxzwvc3Bhbj7IIN3W7cfKIObI 5t3t5SZuYnNwOyDmytHI7dLJIDgg39HH0+wg5iDj2MjOIN/H4+EgztTIIN7U0ckgx9HmIOYgzNLH 48kgztTIIN/I7dHJIOYgyzxzcGFuIG5hbWU9InN0Ij7hxzwvc3Bhbj7LIOPRx8rIINPm08ogysff 7CDmINPMx88gyN/hIMfh29HdIObH4dXH4ebkIObH4dPd0ckg5iDTysfG0SDjx9HP7eTsINPKx+3h IMfj0e3fx+TsINrh7CDf4SDUyMffIObI4d/m5Mkg5iDaz88xIDxzcGFuIHN0eWxlPSJDT0xPUjog IzFmNDk3ZCI+yjwvc3Bhbj7h7d3S7ebkPHNwYW4gc3R5bGU9IkNPTE9SOiAjMWY0OTdkIj4gPC9z cGFuPiZuYnNwOzI1IMjm1ckgyubU7cjHIObaz88xIMrh7d3S7ebkIDIxIMjm1ckg5MfU7ebkx+Eg 5trPzzEg0e3T7d3RIMfTytHHIMjH4djI3iAxODDT4yDjys3R3yDmINrPzzxzcGFuIHN0eWxlPSJD T0xPUjogIzFmNDk3ZCI+IDEgPC9zcGFuPiZuYnNwO8rf7e3dINTH0cggzM/tzyDm2s/PPHNwYW4g c3R5bGU9IkNPTE9SOiAjMWY0OTdkIj4gPC9zcGFuPjEgyt/t7d0g38fR7dEgzM/tzyDmIM/dx+3J IMfm4e3jyN8g0u3KIObj0ebNySDK5tTtyMcgyMfh0e3j5sog5uPf5NPJIN/l0cjHxu3JPC9zcGFu PjwvYj48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZPTlQtU0laRTogMTBwdCI+PGZvbnQg ZmFjZT0iVGltZXMgTmV3IFJvbWFuIj4g5jwvZm9udD48L3NwYW4+PC9iPjxiPjxzcGFuIGxhbmc9 IkFSLVNBIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogQXJpYWwiPiDb08fh ySDd5uEgx8rm48fK7d8gx+3P7cfhINLH5ObT7CAxOCDI0eTH48wg5iDLPHNwYW4gbmFtZT0ic3Qi PuHHPC9zcGFuPszJIMrm1O3IxyAxNCDez+Mg5iDI5srMx9Ig7ebk7d3R08fhIDUg1NrhySDmIMrm 08rH0SDf5dHI7CDm1N3H2CDd7c/t5iDmIOPH7d/R5ubt3SDmMiDTzsfkINvH0iDH5uHjyO3fIOYg 7ebk3dHTx+Eg5iDkzN0g38fj4SDIx+Hb0d0g5iDH4dPd0ckg5sfh1cfh5uQ8L3NwYW4+PC9iPjwv cD4KPC9kaXY+CjxwIGRpcj0icnRsIiBzdHlsZT0iRElSRUNUSU9OOiBydGw7IFRFWFQtSU5ERU5U OiAtMC4yNWluOyBNQVJHSU4tUklHSFQ6IDAuNWluOyBURVhULUFMSUdOOiByaWdodCI+PGI+PHNw YW4gbGFuZz0iQVItU0EiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiAjMzM2NmZmOyBG T05ULUZBTUlMWTogQXJpYWwiPtrR1jg6PC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1TQSIg c3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj48c3Bhbj4mbmJzcDsm bmJzcDsgPC9zcGFuPjxzcGFuIHN0eWxlPSJDT0xPUjogZnVjaHNpYSI+1N7JIOHe2MkgOTDjIMjH 4d7H5dHJIMfhzM/tz8kgytXhzSDj38rIINrtx8/JIMfmINPf5CDh2OHIySDH4ePa5c8gyMzmx9Hl PC9zcGFuPjwvc3Bhbj48L2I+PC9wPgoKPGRpdiBzdHlsZT0iQk9SREVSLVJJR0hUOiBtZWRpdW0g bm9uZTsgUEFERElORy1SSUdIVDogMGluOyBCT1JERVItVE9QOiBtZWRpdW0gbm9uZTsgUEFERElO Ry1MRUZUOiAwaW47IFBBRERJTkctQk9UVE9NOiAxcHQ7IE1BUkdJTi1MRUZUOiAwaW47IEJPUkRF Ui1MRUZUOiBtZWRpdW0gbm9uZTsgTUFSR0lOLVJJR0hUOiAwLjI1aW47IFBBRERJTkctVE9QOiAw aW47IEJPUkRFUi1CT1RUT006IHdpbmRvd3RleHQgMS41cHQgc29saWQiPgoKPHAgZGlyPSJydGwi IHN0eWxlPSJCT1JERVItUklHSFQ6IG1lZGl1bSBub25lOyBQQURESU5HLVJJR0hUOiAwaW47IEJP UkRFUi1UT1A6IG1lZGl1bSBub25lOyBQQURESU5HLUxFRlQ6IDBpbjsgUEFERElORy1CT1RUT006 IDBpbjsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25lOyBESVJFQ1RJT046IHJ0bDsgVEVYVC1JTkRF TlQ6IC0wLjI1aW47IE1BUkdJTi1SSUdIVDogMC4yNWluOyBQQURESU5HLVRPUDogMGluOyBCT1JE RVItQk9UVE9NOiBtZWRpdW0gbm9uZTsgVEVYVC1BTElHTjogcmlnaHQiPgo8Yj48c3BhbiBsYW5n PSJBUi1TQSIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj7U3skg ytXhzSDhzOPt2iDHPHNwYW4gbmFtZT0ic3QiPuHHPC9zcGFuPtvRx9Yg5uE8c3BhbiBuYW1lPSJz dCI+4cc8L3NwYW4+08rL48fRIMft1scg48rU2MjlIMjH3dbhIOPm3togyMfh3tjH4+3JIMjH4crM 49ogyMfh3tHIIOPkIOPa5c8gx+HV5Mfax8ogx+Hjytjm0ckgx+HT2tEgx+Hj2OHmyCDj29HsIMzP x8fHx8fHx8fHxyDd3tggMTIwx+HdIMzk7eUg49XR7Dwvc3Bhbj48L2I+PC9wPgo8L2Rpdj4KPHAg ZGlyPSJydGwiIHN0eWxlPSJESVJFQ1RJT046IHJ0bDsgVEVYVC1JTkRFTlQ6IC0wLjI1aW47IE1B UkdJTi1SSUdIVDogMC41aW47IFRFWFQtQUxJR046IHJpZ2h0Ij48Yj48c3BhbiBsYW5nPSJBUi1T QSIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICMzMzY2ZmY7IEZPTlQtRkFNSUxZOiBB cmlhbCI+2tHWOTo8L3NwYW4+PC9iPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBzdHlsZT0iRk9OVC1T SVpFOiAxMHB0OyBGT05ULUZBTUlMWTogQXJpYWwiPjxzcGFuPiZuYnNwOyZuYnNwOyA8L3NwYW4+ PHNwYW4gc3R5bGU9IkNPTE9SOiBmdWNoc2lhIj7d0dXJIOTHz9HJINTeySDIx+HayObRIMjH4c/m 0SDH4crH5Owgx+PH4yDT5MrRx+Egx+HayObRPC9zcGFuPjwvc3Bhbj48L2I+PC9wPgoKPGRpdiBz dHlsZT0iQk9SREVSLVJJR0hUOiBtZWRpdW0gbm9uZTsgUEFERElORy1SSUdIVDogMGluOyBCT1JE RVItVE9QOiBtZWRpdW0gbm9uZTsgUEFERElORy1MRUZUOiAwaW47IFBBRERJTkctQk9UVE9NOiAx cHQ7IE1BUkdJTi1MRUZUOiAwaW47IEJPUkRFUi1MRUZUOiBtZWRpdW0gbm9uZTsgTUFSR0lOLVJJ R0hUOiAwLjI1aW47IFBBRERJTkctVE9QOiAwaW47IEJPUkRFUi1CT1RUT006IHdpbmRvd3RleHQg MS41cHQgc29saWQiPgoKPHAgZGlyPSJydGwiIHN0eWxlPSJCT1JERVItUklHSFQ6IG1lZGl1bSBu b25lOyBQQURESU5HLVJJR0hUOiAwaW47IEJPUkRFUi1UT1A6IG1lZGl1bSBub25lOyBQQURESU5H LUxFRlQ6IDBpbjsgUEFERElORy1CT1RUT006IDBpbjsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25l OyBESVJFQ1RJT046IHJ0bDsgVEVYVC1JTkRFTlQ6IC0wLjI1aW47IE1BUkdJTi1SSUdIVDogMC4y NWluOyBQQURESU5HLVRPUDogMGluOyBCT1JERVItQk9UVE9NOiBtZWRpdW0gbm9uZTsgVEVYVC1B TElHTjogcmlnaHQiPgo8Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZPTlQtU0laRTogMTBw dDsgRk9OVC1GQU1JTFk6IEFyaWFsIj7h4cjt2iDU3skgyMfh2sjm0SDj08fNyuXHIDYz4yDayMfR 5SDa5CAy5ObjIObVx+HlIOPY4ebIIDY1x+HdIMzk7eUg49XR7CDm1OXR7CA3MCDM5O3lIOPV0ewg 5uTe4SDH4ePh3+3JIOPIx9TRySDH4ePH4d8gPC9zcGFuPjwvYj48L3A+PC9kaXY+CjxwIGRpcj0i cnRsIiBzdHlsZT0iRElSRUNUSU9OOiBydGw7IFRFWFQtSU5ERU5UOiAtMC4yNWluOyBNQVJHSU4t UklHSFQ6IDAuNWluOyBURVhULUFMSUdOOiByaWdodCI+PGI+PHNwYW4gbGFuZz0iQVItU0EiIHN0 eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiAjMzM2NmZmOyBGT05ULUZBTUlMWTogQXJpYWwi PtrR1jEwOjwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItU0EiIHN0eWxlPSJGT05ULVNJWkU6 IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+IDxzcGFuIHN0eWxlPSJDT0xPUjogZnVjaHNpYSI+ 1N7JIDYz4yDIx+Ha3dQg5sfhx8zl0skgyMfh1NHm3jwvc3Bhbj48L3NwYW4+PC9iPjwvcD4KCjxw IGRpcj0icnRsIiBzdHlsZT0iRElSRUNUSU9OOiBydGw7IFRFWFQtSU5ERU5UOiAtMC4yNWluOyBN QVJHSU4tUklHSFQ6IDAuNWluOyBURVhULUFMSUdOOiByaWdodCI+PGI+PHNwYW4gbGFuZz0iQVIt U0EiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+4eHI7dog1N7J IM/m0SDH0dbsIOPTx83JIDYz4yDayMfR5SDa5CAy5ObjIObVx+HlIObj2MjOIObN48fjIOPK1NjI 5SDmyOXHIMzj7dogx+HHzOXSySDmx+Ha3dQgx+HT2tEgMTIwx+HdIMzk7eUg49XR7CA8L3NwYW4+ PC9iPjwvcD4KCjxwIGRpcj0icnRsIiBzdHlsZT0iRElSRUNUSU9OOiBydGw7IFRFWFQtSU5ERU5U OiAtMC4yNWluOyBNQVJHSU4tUklHSFQ6IDAuNWluOyBURVhULUFMSUdOOiByaWdodCI+PGI+PHNw YW4gbGFuZz0iQVItU0EiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlh bCI+X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fPC9zcGFuPjwvYj48L3A+Cjxw IGRpcj0icnRsIiBzdHlsZT0iRElSRUNUSU9OOiBydGw7IFRFWFQtSU5ERU5UOiAtMC4yNWluOyBN QVJHSU4tUklHSFQ6IDAuNWluOyBURVhULUFMSUdOOiByaWdodCI+PGI+PHNwYW4gbGFuZz0iQVIt U0EiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiAjMzM2NmZmOyBGT05ULUZBTUlMWTog QXJpYWwiPtrR1jExOjwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItU0EiIHN0eWxlPSJGT05U LVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PHNwYW4+Jm5ic3A7IDwvc3Bhbj48c3Bh biBzdHlsZT0iQ09MT1I6IGZ1Y2hzaWEiPuPM4+baySDU3t4g48rt49LJIMzPxyDIx+HU7c4g0sft zyDj08fNx8og487K4d3JPC9zcGFuPjwvc3Bhbj48L2I+PC9wPgoKPHAgZGlyPSJydGwiIHN0eWxl PSJESVJFQ1RJT046IHJ0bDsgVEVYVC1JTkRFTlQ6IC0wLjI1aW47IE1BUkdJTi1SSUdIVDogMC41 aW47IFRFWFQtQUxJR046IHJpZ2h0Ij48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZPTlQt U0laRTogMTBwdDsgQ09MT1I6ICMzMzY2ZmY7IEZPTlQtRkFNSUxZOiBBcmlhbCI+MV88L3NwYW4+ PC9iPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZB TUlMWTogQXJpYWwiPiDU3skgz+bRIMfR1uwg49HK3dog49PHzckgMTAw4yDayMfRySDa5CAy5Obj PHNwYW4+Jm5ic3A7IDwvc3Bhbj7fyO3RyeYy0dPI1OQg5s3jx+Mg5uPYyM4g5sjh3+bkPHNwYW4+ Jm5ic3A7IDwvc3Bhbj7K1eHNIMrMx9HsIMfmINPf5Owgx+Ygx8/H0ewgx+PH4yDT5MrRIM3t5uwg zM/Hx8cg5sft1scg2uHsIM3P7d7JIN/I7dHJIM7H4dXlIOPaIMfhyOTfIOPY4ebIINPa0SDhxyDt 3sfR5DxzcGFuPiZuYnNwOyA8L3NwYW4+MTE1x+HdIMzk7eUg49XR7CDd3tg8L3NwYW4+PC9iPjwv cD4KCjxwIGRpcj0icnRsIiBzdHlsZT0iRElSRUNUSU9OOiBydGw7IFRFWFQtSU5ERU5UOiAtMC4y NWluOyBNQVJHSU4tUklHSFQ6IDAuNWluOyBURVhULUFMSUdOOiByaWdodCI+PGI+PHNwYW4gbGFu Zz0iQVItU0EiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiAjMzM2NmZmOyBGT05ULUZB TUlMWTogQXJpYWwiPjJfPC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZP TlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj4g1N7JIDcw4yDKyNogx+HM5cfSIMjH 4dTtziDSx+3PIMfTysvjx9HsIM/m0TMg49PHzckgNzDjIMrU2O3IIMfhzOXH0iDj2OHmyCA4Ncfh 3SDM5O3lIOPV0ewg5trh7eXHIDY0MMzk7eUg1OXR7CDh48/lIDIw0+TJIDwvc3Bhbj48L2I+PC9w PgoKPGRpdiBzdHlsZT0iQk9SREVSLVJJR0hUOiBtZWRpdW0gbm9uZTsgUEFERElORy1SSUdIVDog MGluOyBCT1JERVItVE9QOiBtZWRpdW0gbm9uZTsgUEFERElORy1MRUZUOiAwaW47IFBBRERJTkct Qk9UVE9NOiAxcHQ7IE1BUkdJTi1MRUZUOiAwaW47IEJPUkRFUi1MRUZUOiBtZWRpdW0gbm9uZTsg TUFSR0lOLVJJR0hUOiAwLjI1aW47IFBBRERJTkctVE9QOiAwaW47IEJPUkRFUi1CT1RUT006IHdp bmRvd3RleHQgMS41cHQgc29saWQiPgoKPHAgZGlyPSJydGwiIHN0eWxlPSJCT1JERVItUklHSFQ6 IG1lZGl1bSBub25lOyBQQURESU5HLVJJR0hUOiAwaW47IEJPUkRFUi1UT1A6IG1lZGl1bSBub25l OyBQQURESU5HLUxFRlQ6IDBpbjsgUEFERElORy1CT1RUT006IDBpbjsgQk9SREVSLUxFRlQ6IG1l ZGl1bSBub25lOyBESVJFQ1RJT046IHJ0bDsgVEVYVC1JTkRFTlQ6IC0wLjI1aW47IE1BUkdJTi1S SUdIVDogMC4yNWluOyBQQURESU5HLVRPUDogMGluOyBCT1JERVItQk9UVE9NOiBtZWRpdW0gbm9u ZTsgVEVYVC1BTElHTjogcmlnaHQiPgo8Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZPTlQt U0laRTogMTBwdDsgQ09MT1I6ICMzMzY2ZmY7IEZPTlQtRkFNSUxZOiBBcmlhbCI+M188L3NwYW4+ PC9iPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZB TUlMWTogQXJpYWwiPiDU3skgMTg14yDIx+HU7c4g0sftzyDIx+HN7CDH4cfm4SDH4ePMx+bRySDH 4cvH5O3JINrjx9HJIMflx+HsPHNwYW4+Jm5ic3A7IDwvc3Bhbj7ayMfR5SDa5CAz5ObjIObVx+Hl IObb0d3JINjax+M8c3Bhbj4mbmJzcDsgPC9zcGFuPuYyzePH4yDm49jIziDmyOHf5uQg5u3mzM8g x+3WxyDU3srt5CDk3dMgx+Hj08fNyTxzcGFuPiZuYnNwOyA8L3NwYW4+4+Pf5CDW4+XjINrh7CDI 2tYgPC9zcGFuPjwvYj48L3A+CjwvZGl2Pgo8cCBkaXI9InJ0bCIgc3R5bGU9IkRJUkVDVElPTjog cnRsOyBURVhULUlOREVOVDogLTAuMjVpbjsgTUFSR0lOLVJJR0hUOiAwLjVpbjsgVEVYVC1BTElH TjogcmlnaHQiPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBD T0xPUjogIzMzNjZmZjsgRk9OVC1GQU1JTFk6IEFyaWFsIj7a0dYxMjo8L3NwYW4+PC9iPjxiPjxz cGFuIGxhbmc9IkFSLVNBIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogQXJp YWwiPjxzcGFuPiZuYnNwOyZuYnNwOyA8L3NwYW4+PHNwYW4gc3R5bGU9IkNPTE9SOiBmdWNoc2lh Ij7U3skgMTAw4yDa4ewg1MfR2iDd7dXhIMfh0cbt0+wgytTY7cggz+3h5t/TPC9zcGFuPjwvc3Bh bj48L2I+PC9wPgoKPHAgZGlyPSJydGwiIHN0eWxlPSJESVJFQ1RJT046IHJ0bDsgVEVYVC1JTkRF TlQ6IC0wLjI1aW47IE1BUkdJTi1SSUdIVDogMC41aW47IFRFWFQtQUxJR046IHJpZ2h0Ij48Yj48 c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFy aWFsIj7h4cjt2iDU3skg3+HlxyDa4ewg3e3V4SDH4dHG7dPsINXH3ewgODXjINrIx9HlINrkIDLk 5uMg5jPR08jU5CDmzePH4yDm49jIziDIx+HP1CDmx+HK4e3d5uQg5sfhyuHt3dLt5uQgyMfhz+bR IMfh0cfI2iDmyOXHIM/t3+bRx8og5tTIx8jt3yDH4ebj7crH4SDa48fRySDfyO3RySDm48/O4SDU 7d8g0+HH4eMg5sfT2sk8c3Bhbj4mbmJzcDsgPC9zcGFuPsfh09rRINHHxtogMTQ1x+HdIMzk7eUg 49XR7CA8L3NwYW4+PC9iPjwvcD4KCjxkaXYgc3R5bGU9IkJPUkRFUi1SSUdIVDogbWVkaXVtIG5v bmU7IFBBRERJTkctUklHSFQ6IDBpbjsgQk9SREVSLVRPUDogd2luZG93dGV4dCAxLjVwdCBzb2xp ZDsgUEFERElORy1MRUZUOiAwaW47IFBBRERJTkctQk9UVE9NOiAxcHQ7IE1BUkdJTi1MRUZUOiAw aW47IEJPUkRFUi1MRUZUOiBtZWRpdW0gbm9uZTsgTUFSR0lOLVJJR0hUOiAwLjI1aW47IFBBRERJ TkctVE9QOiAxcHQ7IEJPUkRFUi1CT1RUT006IHdpbmRvd3RleHQgMS41cHQgc29saWQiPgoKPHAg ZGlyPSJydGwiIHN0eWxlPSJCT1JERVItUklHSFQ6IG1lZGl1bSBub25lOyBQQURESU5HLVJJR0hU OiAwaW47IEJPUkRFUi1UT1A6IG1lZGl1bSBub25lOyBQQURESU5HLUxFRlQ6IDBpbjsgUEFERElO Ry1CT1RUT006IDBpbjsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25lOyBESVJFQ1RJT046IHJ0bDsg VEVYVC1JTkRFTlQ6IC0wLjI1aW47IE1BUkdJTi1SSUdIVDogMC4yNWluOyBQQURESU5HLVRPUDog MGluOyBCT1JERVItQk9UVE9NOiBtZWRpdW0gbm9uZTsgVEVYVC1BTElHTjogcmlnaHQiPgo8Yj48 c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICMzMzY2ZmY7 IEZPTlQtRkFNSUxZOiBBcmlhbCI+2tHWMTM6PC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1T QSIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj4gPHNwYW4gc3R5 bGU9IkNPTE9SOiBmdWNoc2lhIj7U3skgyOPP7eTK7CA8c3Bhbj4mbmJzcDs8L3NwYW4+x+Hj0c3h ySDH4dPHz9PJPC9zcGFuPjxzcGFuPiZuYnNwOyA8L3NwYW4+x8zjx+HsIMfh3u3j5SA1MjHH4d0g zOTt5SDj1dHsIOY4MDDM5O3lIOPV0ew8c3Bhbj4mbmJzcDsgPC9zcGFuPubQ4d8g2uHsIDEw0+Tm x8ogyuPjIM/d2iAyOcfh3SDmNjUwzOTt5SDmx9TK0cffIMfh5MfP7CA0MDAwx+HH3SDm1OXR7CAx MzA1zOTt5SDj1dHsIObK5N7VIMjazyDH0cfI2iDT5ObHyiDH4ewgx+HsIDEyMTDM5O3lIOPV0ew8 c3Bhbj4mbmJzcDsgPC9zcGFuPuPY4ebIIMfm3dEgNDXH4d0gzOTt5SDj1dHsIDwvc3Bhbj48L2I+ PC9wPgo8L2Rpdj4KPHAgZGlyPSJydGwiIHN0eWxlPSJESVJFQ1RJT046IHJ0bDsgVEVYVC1JTkRF TlQ6IC0wLjI1aW47IE1BUkdJTi1SSUdIVDogMC41aW47IFRFWFQtQUxJR046IHJpZ2h0Ij48Yj48 c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICMzMzY2ZmY7 IEZPTlQtRkFNSUxZOiBBcmlhbCI+2tHWMTQ6PC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1T QSIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj48c3Bhbj4mbmJz cDsgPC9zcGFuPjxzcGFuIHN0eWxlPSJDT0xPUjogZnVjaHNpYSI+1Mfh7eUg3uPJIOPkIMfh0eba ySDmx+Hlz+bBIMjH4dPHzeEgx+HU48fh7Twvc3Bhbj4gx+Hf7eHmIDQ1IOPK1NjIINPmyNEg4ebf 0yZuYnNwOyDIx+Hd0dQgy8fk7SDV3SDIzdEgyN7R7ckgx+HUx+Ht5SAxMjDjIOYyzc/t3uUgzuHd 7CDmx+PH4+0g4eUg48/O4SDOx9Ug3e3lxyAyIM3jx+Mg08jHzeUg5uPm4SDmzMfj2iDm38fdytHt xyDm5Nnt3eUgzM/HIMrmzM8gx+HV5tEgx+HOx9XJIMjH4dTH4e3JIDwvc3Bhbj48L2I+PC9wPgoK PGRpdiBzdHlsZT0iQk9SREVSLVJJR0hUOiBtZWRpdW0gbm9uZTsgUEFERElORy1SSUdIVDogMGlu OyBCT1JERVItVE9QOiBtZWRpdW0gbm9uZTsgUEFERElORy1MRUZUOiAwaW47IFBBRERJTkctQk9U VE9NOiAxcHQ7IE1BUkdJTi1MRUZUOiAwaW47IEJPUkRFUi1MRUZUOiBtZWRpdW0gbm9uZTsgTUFS R0lOLVJJR0hUOiAwLjI1aW47IFBBRERJTkctVE9QOiAwaW47IEJPUkRFUi1CT1RUT006IHdpbmRv d3RleHQgMS41cHQgc29saWQiPgoKPHAgZGlyPSJydGwiIHN0eWxlPSJCT1JERVItUklHSFQ6IG1l ZGl1bSBub25lOyBQQURESU5HLVJJR0hUOiAwaW47IEJPUkRFUi1UT1A6IG1lZGl1bSBub25lOyBQ QURESU5HLUxFRlQ6IDBpbjsgUEFERElORy1CT1RUT006IDBpbjsgQk9SREVSLUxFRlQ6IG1lZGl1 bSBub25lOyBESVJFQ1RJT046IHJ0bDsgVEVYVC1JTkRFTlQ6IC0wLjI1aW47IE1BUkdJTi1SSUdI VDogMC4yNWluOyBQQURESU5HLVRPUDogMGluOyBCT1JERVItQk9UVE9NOiBtZWRpdW0gbm9uZTsg VEVYVC1BTElHTjogcmlnaHQiPgo8Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZPTlQtU0la RTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj7H4dPa0SDH4ePY4ebIIDQ1MMfh3SDM5O3lIOPV 0ewgPC9zcGFuPjwvYj48L3A+PC9kaXY+CjxwIHN0eWxlPSJNQVJHSU46IDBpbiAwaW4gMHB0Ij48 Yj48c3BhbiBsYW5nPSJBUi1FRyIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENP TE9SOiByZWQiPjxmb250IGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+x+TK5dIgx+Hd0dXJIOPM4+ba ySDH0cfW7CDjyuPt0skg09rRIMfh48rRIO3Iz8cg4+QgNjUwzCDNyuwgMzIwMMwgyMfh2sfU0SDj 5CDR49bH5CDmx+Hex+XR5SDH4czP7c/JIObH4dTR5t4g5tTI0ccg5sjk5ccg5sfT48fa7eHtySDm yM/RPC9mb250Pjwvc3Bhbj48L2I+PC9wPgoKPHAgc3R5bGU9Ik1BUkdJTjogMGluIDBpbiAwcHQi PjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9IkZPTlQtU0laRTogMTBwdCI+PGZv bnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj4mbmJzcDs8L2ZvbnQ+PC9zcGFuPjwvcD4KPHAgc3R5 bGU9Ik1BUkdJTjogMGluIDBpbiAwcHQiPjxmb250IGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+PGI+ PHNwYW4gbGFuZz0iQVItRUciIGRpcj0icnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xP UjogIzMzNjZmZiI+x+Ha0dYxOjwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItRUciIGRpcj0i cnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0Ij48c3Bhbj4mbmJzcDsmbmJzcDsgPC9zcGFuPjxz cGFuIHN0eWxlPSJDT0xPUjogZnVjaHNpYSI+3tjaySDH0dYgyNPa0SDj29HsINPa0SDH4ePK0SA2 NTDM5O3lIOPV0ewg3d7YIDwvc3Bhbj48L3NwYW4+PC9iPjwvZm9udD48L3A+Cgo8cCBzdHlsZT0i TUFSR0lOOiAwaW4gMGluIDBwdCI+PGI+PHNwYW4gbGFuZz0iQVItRUciIGRpcj0icnRsIiBzdHls ZT0iRk9OVC1TSVpFOiAxMHB0Ij48Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPsjH4drH1NEg 4+Qg0ePWx+Qg48/t5Mkgx+HR5tbJPHNwYW4+Jm5ic3A7IDwvc3Bhbj7H4c7W0cfBIMjM5sfRIOPP 7eTJIMfh7cfT4+3kIOPTx83JIDIzMuMg487V5eUg09/kINrHxuHsIDTHz+bH0SDa7CDUx9HaINHG 7dPsIDEy4yDm48cg7ePt0uXHIMft1scg4e3TIOHlxyDjz+Ug0uPk7eUg4eHI5MfBIObmyOXHIOPR x93eIN/m48jm5M8g5s7H4dXlIMfhy+PkIObH5MrZ0SDH7dbHIMfkIOXkx98gyt3H5tYg3ewgx+HT 2tEgPC9mb250Pjwvc3Bhbj48L2I+PC9wPgoKPGRpdiBzdHlsZT0iQk9SREVSLVJJR0hUOiBtZWRp dW0gbm9uZTsgUEFERElORy1SSUdIVDogMGluOyBCT1JERVItVE9QOiB3aW5kb3d0ZXh0IDEuNXB0 IHNvbGlkOyBQQURESU5HLUxFRlQ6IDBpbjsgUEFERElORy1CT1RUT006IDFwdDsgQk9SREVSLUxF RlQ6IG1lZGl1bSBub25lOyBQQURESU5HLVRPUDogMXB0OyBCT1JERVItQk9UVE9NOiB3aW5kb3d0 ZXh0IDEuNXB0IHNvbGlkIj4KPHAgc3R5bGU9IkJPUkRFUi1SSUdIVDogbWVkaXVtIG5vbmU7IFBB RERJTkctUklHSFQ6IDBpbjsgQk9SREVSLVRPUDogbWVkaXVtIG5vbmU7IFBBRERJTkctTEVGVDog MGluOyBQQURESU5HLUJPVFRPTTogMGluOyBNQVJHSU46IDBpbiAwaW4gMHB0OyBCT1JERVItTEVG VDogbWVkaXVtIG5vbmU7IFBBRERJTkctVE9QOiAwaW47IEJPUkRFUi1CT1RUT006IG1lZGl1bSBu b25lIj48Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBk aXI9InJ0bCIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICMzMzY2ZmYiPsfh2tHWMjo8 L3NwYW4+PC9iPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9IkZPTlQtU0la RTogMTBwdCI+PHNwYW4+Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48c3BhbiBzdHlsZT0iQ09MT1I6IGZ1 Y2hzaWEiPt3R1ckg4dnR5t0g5czRySDe2NrJIMfR1iDd1sfBIOHhyO3aIMjjz+3kySDH4d7k2NHJ INTR3trh7CDkx9Xtyu3kPC9zcGFuPjxzcGFuPiZuYnNwOyA8L3NwYW4+49PHzckgMTcw4yDMx+XS ySDh4cjkx8Eg38fj4ckgx+Hj0cfd3iDH4ePtx+Ugx+Hf5dHIx8Eg5tPa0SDH4ePK0SAyODDM5O3l IOPV0ew8L3NwYW4+PC9iPjwvZm9udD48L3A+CjwvZGl2Pgo8cCBzdHlsZT0iTUFSR0lOOiAwaW4g MGluIDBwdCI+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj48Yj48c3BhbiBsYW5nPSJBUi1F RyIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiAjMzM2NmZmIj7H4drR 1jM6PC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1FRyIgZGlyPSJydGwiIHN0eWxlPSJGT05U LVNJWkU6IDEwcHQiPjxzcGFuPiZuYnNwOyZuYnNwOyA8L3NwYW4+PHNwYW4gc3R5bGU9IkNPTE9S OiBmdWNoc2lhIj7h0cfbyOwgx+HK4+3SIN7Y2skgx9HWINrh7CDH4dTH0dogx+HRxu3T7CDIx+HK zOPaIMfhzsfj0zwvc3Bhbj48L3NwYW4+PC9iPjwvZm9udD48L3A+Cgo8cCBzdHlsZT0iTUFSR0lO OiAwaW4gMGluIDBwdCI+PGI+PHNwYW4gbGFuZz0iQVItRUciIGRpcj0icnRsIiBzdHlsZT0iRk9O VC1TSVpFOiAxMHB0Ij48Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPuHhyO3aIMfR1iDIx+He x+XR5SDH4czP7c/JINPf5CDax8bh7CDj5NjeySDH4ePTysvj0e3kINrh7CDH4dTH0dogx+HRxu3T 7CDH4eHsINrh7CDkx9XtyuUgzewgx+Hj1dHH5u3JIMfh48rd0dog4+Qg1MfR2iDH4crT2u3kIOPm 3tog0cfe7CDMz8fHx8fHxyDj08fNySAyODDjIObK4yDH08rO0cfMINHO1ckg48jH5OwgyM/R5uMg 5sfR1uwg5jPHz+bH0SDT2tEgx+Hj2OHmyCDh4ePK0SAzMjAwzOTt5SDj1dHsPC9mb250Pjwvc3Bh bj48L2I+PC9wPgoKPGRpdiBzdHlsZT0iQk9SREVSLVJJR0hUOiBtZWRpdW0gbm9uZTsgUEFERElO Ry1SSUdIVDogMGluOyBCT1JERVItVE9QOiB3aW5kb3d0ZXh0IDEuNXB0IHNvbGlkOyBQQURESU5H LUxFRlQ6IDBpbjsgUEFERElORy1CT1RUT006IDFwdDsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25l OyBQQURESU5HLVRPUDogMXB0OyBCT1JERVItQk9UVE9NOiB3aW5kb3d0ZXh0IDEuNXB0IHNvbGlk Ij4KPHAgc3R5bGU9IkJPUkRFUi1SSUdIVDogbWVkaXVtIG5vbmU7IFBBRERJTkctUklHSFQ6IDBp bjsgQk9SREVSLVRPUDogbWVkaXVtIG5vbmU7IFBBRERJTkctTEVGVDogMGluOyBQQURESU5HLUJP VFRPTTogMGluOyBNQVJHSU46IDBpbiAwaW4gMHB0OyBCT1JERVItTEVGVDogbWVkaXVtIG5vbmU7 IFBBRERJTkctVE9QOiAwaW47IEJPUkRFUi1CT1RUT006IG1lZGl1bSBub25lIj48Zm9udCBmYWNl PSJUaW1lcyBOZXcgUm9tYW4iPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9 IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICMzMzY2ZmYiPsfh2tHWIDQ6PHNwYW4+Jm5ic3A7IDwv c3Bhbj48L3NwYW4+PC9iPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9IkZP TlQtU0laRTogMTBwdDsgQ09MT1I6IGZ1Y2hzaWEiPsfR1iDIx+HU0ebeIOPK4+3SySDMz8fHx8cg x+PH4yDjz+3kyuwgPC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1FRyIgZGlyPSJydGwiIHN0 eWxlPSJGT05ULVNJWkU6IDEwcHQiPjwvc3Bhbj48L2I+PC9mb250PjwvcD4KCjxwIHN0eWxlPSJC T1JERVItUklHSFQ6IG1lZGl1bSBub25lOyBQQURESU5HLVJJR0hUOiAwaW47IEJPUkRFUi1UT1A6 IG1lZGl1bSBub25lOyBQQURESU5HLUxFRlQ6IDBpbjsgUEFERElORy1CT1RUT006IDBpbjsgTUFS R0lOOiAwaW4gMGluIDBwdDsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25lOyBQQURESU5HLVRPUDog MGluOyBCT1JERVItQk9UVE9NOiBtZWRpdW0gbm9uZSI+PGI+PHNwYW4gbGFuZz0iQVItRUciIGRp cj0icnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0Ij48Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9t YW4iPuHhyO3aIN7Y2skgx9HWIOPTx83K5cc8c3Bhbj4mbmJzcDsgPC9zcGFuPjg2NOMgx+PH4yDj z+3kyuwgze3LIMfh3e3mIMfh0cfG2iDmx+Hlz+bBIMjH4ePk2N7JIMfhzsfj08kgx9HWINrjx9HH yiDIz9Hm4yDmx9HW7CDmM8fP5sfRIOPK39HRyTxzcGFuPiZuYnNwOyA8L3NwYW4+49jh5sggNTAw x+HdIMzk7eUg49XR7CA8L2ZvbnQ+PC9zcGFuPjwvYj48L3A+CjwvZGl2Pgo8cCBzdHlsZT0iTUFS R0lOOiAwaW4gMGluIDBwdCI+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj48Yj48c3BhbiBs YW5nPSJBUi1FRyIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiAjMzM2 NmZmIj7H4drR1jU6PC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1FRyIgZGlyPSJydGwiIHN0 eWxlPSJGT05ULVNJWkU6IDEwcHQiPjxzcGFuPiZuYnNwOyA8L3NwYW4+PHNwYW4gc3R5bGU9IkNP TE9SOiBmdWNoc2lhIj48c3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+x9HWIOHe2Mkg2uHs IMffyNEg5sfU5dEg4+3Px+QgyNTI0ccg5MfV7ckgyM3R7CDb0cjsIOba4ewgx+HjytHmPC9zcGFu Pjwvc3Bhbj48L2I+PC9mb250PjwvcD4KCjxkaXYgc3R5bGU9IkJPUkRFUi1SSUdIVDogbWVkaXVt IG5vbmU7IFBBRERJTkctUklHSFQ6IDBpbjsgQk9SREVSLVRPUDogbWVkaXVtIG5vbmU7IFBBRERJ TkctTEVGVDogMGluOyBQQURESU5HLUJPVFRPTTogMXB0OyBCT1JERVItTEVGVDogbWVkaXVtIG5v bmU7IFBBRERJTkctVE9QOiAwaW47IEJPUkRFUi1CT1RUT006IHdpbmRvd3RleHQgMS41cHQgc29s aWQiPgo8cCBzdHlsZT0iQk9SREVSLVJJR0hUOiBtZWRpdW0gbm9uZTsgUEFERElORy1SSUdIVDog MGluOyBCT1JERVItVE9QOiBtZWRpdW0gbm9uZTsgUEFERElORy1MRUZUOiAwaW47IFBBRERJTkct Qk9UVE9NOiAwaW47IE1BUkdJTjogMGluIDBpbiAwcHQ7IEJPUkRFUi1MRUZUOiBtZWRpdW0gbm9u ZTsgUEFERElORy1UT1A6IDBpbjsgQk9SREVSLUJPVFRPTTogbWVkaXVtIG5vbmUiPjxiPjxzcGFu IGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9IkZPTlQtU0laRTogMTBwdCI+PGZvbnQgZmFj ZT0iVGltZXMgTmV3IFJvbWFuIj7h4cjt2iDe2NrJIMfR1iDI1MjRxyA8L2ZvbnQ+PC9zcGFuPjwv Yj48Yj48c3BhbiBsYW5nPSJBUi1TQSIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7 IEZPTlQtRkFNSUxZOiBBcmlhbCI+yOPm3togx9/L0SDj5CDj48rH0iDK1eHNIOHfx93JIMfh49TH 0e3aIMfhx9PKy+PH0e3JINDHyiDRyM3tySDax+HtySDMz8fHx8fHx8cg5sre2iDm09gmbmJzcDsg x9/I0SDKzMfRIN7Y2iDb7cfRIMfh0+3H0cfKIObK2OEg2uHsIMfh4+3Px+Qg5uPK0eYgx+HH5N3H 3iDjyMfU0ck8c3Bhbj4mbmJzcDsgPC9zcGFuPuPTx83K5ccgNTcw4yDmx+HT2tEgx+Hj2OHmyCDh 4ePK0SAzMDAwzOTt5SDj1dHsIDwvc3Bhbj48L2I+PC9wPgo8L2Rpdj4KPHAgc3R5bGU9Ik1BUkdJ TjogMGluIDBpbiAwcHQiPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBkaXI9InJ0bCIgc3R5bGU9IkZP TlQtU0laRTogMTBwdDsgQ09MT1I6ICMzMzY2ZmY7IEZPTlQtRkFNSUxZOiBBcmlhbCI+x+Ha0dY2 Ojwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItU0EiIGRpcj0icnRsIiBzdHlsZT0iRk9OVC1T SVpFOiAxMHB0OyBGT05ULUZBTUlMWTogQXJpYWwiPjxzcGFuPiZuYnNwOyZuYnNwOyA8L3NwYW4+ PHNwYW4gc3R5bGU9IkNPTE9SOiBmdWNoc2lhIj7H0dYg48rj7dLlPHNwYW4+Jm5ic3A7IDwvc3Bh bj4zMTXjINrh7CDH4dTH0dogx+HRxu3T7CDI48/t5MkgyM/RPC9zcGFuPjwvc3Bhbj48L2I+PC9w PgoKPHAgc3R5bGU9Ik1BUkdJTjogMGluIDBpbiAwcHQiPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBk aXI9InJ0bCIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj7jz+3k ySDIz9Eg4eXHIOPTyt7I4SDIx+XRIObH4cfR1iDj4+3SySDUx9HaINHG7dPsIMfRyNogzcfRx8og 5uPkIMfhzuHdIOPk2N7JIM7W0cfBIObH09rJIMvH5Owg3tjaySDj5CDH4eTH1e3JIO3d1eHl48cg 4+PRLiDjzd3m0ckg5szH5dLJIOHhyOTHwSDfx+PhySDH4ePRx93eIDwvc3Bhbj48L2I+PC9wPgoK PHAgc3R5bGU9Ik1BUkdJTjogMGluIDBpbiAwcHQiPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBkaXI9 InJ0bCIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj7Ix+HRztXJ IMjP0ebjIObH0dbsIObL4cfLIOPK39HRIMrH0e3OIMfh0c7VyTYvMjAwOCDm49PHzckgx+HH0dbs IDE4MOMg5sfh48rf0dExODYuNeMg4+XhySDT5MkgyOTHwSDm0+TJIMrU2O3IIMfh49jh5sggMTIw x+HdIMzk7eUg49XR7CDfx9Qg5trh7eXHIDU3x+HdIMzk7eUg49XR7DxzcGFuPiZuYnNwOyA8L3Nw YW4+4eHM5cfSIMfIys/Hwccg4+Qg0+TlIDIwMTAgx+HsINPk5SAyMDE2PC9zcGFuPjwvYj48c3Bh biBkaXI9Imx0ciI+PC9zcGFuPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBzdHlsZT0iRk9OVC1TSVpF OiAxMHB0OyBGT05ULUZBTUlMWTogQXJpYWwiPjxzcGFuIGRpcj0ibHRyIj48L3NwYW4+IDxzcGFu IGRpcj0icnRsIj48L3NwYW4+PHNwYW4gZGlyPSJydGwiPjxzcGFuIGRpcj0icnRsIj48L3NwYW4+ PHNwYW4+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9iPjxzcGFuIGRpcj0ibHRyIj48L3Nw YW4+PGI+PHNwYW4gc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj48 c3BhbiBkaXI9Imx0ciI+PC9zcGFuPjxzcGFuPiZuYnNwOyZuYnNwOzwvc3Bhbj48c3BhbiBkaXI9 InJ0bCI+PC9zcGFuPjxzcGFuIGRpcj0icnRsIj48c3BhbiBkaXI9InJ0bCI+PC9zcGFuPjxzcGFu PiZuYnNwOzwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvYj48Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9t YW4iPjxiPjxzcGFuIGRpcj0icnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0Ij48c3Bhbj4mbmJz cDs8L3NwYW4+PC9zcGFuPjwvYj48Yj48c3BhbiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05U LUZBTUlMWTogQXJpYWwiPjwvc3Bhbj48L2I+PC9mb250PjwvcD4KCjxkaXYgc3R5bGU9IkJPUkRF Ui1SSUdIVDogbWVkaXVtIG5vbmU7IFBBRERJTkctUklHSFQ6IDBpbjsgQk9SREVSLVRPUDogbWVk aXVtIG5vbmU7IFBBRERJTkctTEVGVDogMGluOyBQQURESU5HLUJPVFRPTTogMXB0OyBCT1JERVIt TEVGVDogbWVkaXVtIG5vbmU7IFBBRERJTkctVE9QOiAwaW47IEJPUkRFUi1CT1RUT006IHdpbmRv d3RleHQgMS41cHQgc29saWQiPgo8cCBzdHlsZT0iQk9SREVSLVJJR0hUOiBtZWRpdW0gbm9uZTsg UEFERElORy1SSUdIVDogMGluOyBCT1JERVItVE9QOiBtZWRpdW0gbm9uZTsgUEFERElORy1MRUZU OiAwaW47IFBBRERJTkctQk9UVE9NOiAwaW47IE1BUkdJTjogMGluIDBpbiAwcHQ7IEJPUkRFUi1M RUZUOiBtZWRpdW0gbm9uZTsgUEFERElORy1UT1A6IDBpbjsgQk9SREVSLUJPVFRPTTogbWVkaXVt IG5vbmUiPjxiPjxzcGFuIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQiPjxmb250IGZhY2U9IlRpbWVz IE5ldyBSb21hbiI+Jm5ic3A7PC9mb250Pjwvc3Bhbj48L2I+PC9wPgo8L2Rpdj4KPHAgc3R5bGU9 Ik1BUkdJTjogMGluIDBpbiAwcHQiPjxmb250IGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+PGI+PHNw YW4gbGFuZz0iQVItRUciIGRpcj0icnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjog IzMzNjZmZiI+x+Ha0dY3Ojwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItRUciIGRpcj0icnRs IiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogYmxhY2siPjxzcGFuPiZuYnNwOyZuYnNw OyA8L3NwYW4+PC9zcGFuPjwvYj48L2ZvbnQ+PGI+PHNwYW4gbGFuZz0iQVItRUciIGRpcj0icnRs IiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogZnVjaHNpYTsgRk9OVC1GQU1JTFk6IFRh aG9tYSI+w9HWIMjH4ePRzCDK1eHNIOHF3sfjySDjzsjSIMfmIObNz8fKINPf5O3JIMjT2tEg4d7Y yTwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItRUciIGRpcj0icnRsIiBzdHlsZT0iRk9OVC1T SVpFOiAxMHB0OyBDT0xPUjogYmxhY2s7IEZPTlQtRkFNSUxZOiBUYWhvbWEiPjwvc3Bhbj48L2I+ PC9wPgoKPGRpdiBzdHlsZT0iQk9SREVSLVJJR0hUOiBtZWRpdW0gbm9uZTsgUEFERElORy1SSUdI VDogMGluOyBCT1JERVItVE9QOiBtZWRpdW0gbm9uZTsgUEFERElORy1MRUZUOiAwaW47IFBBRERJ TkctQk9UVE9NOiAxcHQ7IEJPUkRFUi1MRUZUOiBtZWRpdW0gbm9uZTsgUEFERElORy1UT1A6IDBp bjsgQk9SREVSLUJPVFRPTTogd2luZG93dGV4dCAxLjVwdCBzb2xpZCI+CjxwIHN0eWxlPSJCT1JE RVItUklHSFQ6IG1lZGl1bSBub25lOyBQQURESU5HLVJJR0hUOiAwaW47IEJPUkRFUi1UT1A6IG1l ZGl1bSBub25lOyBQQURESU5HLUxFRlQ6IDBpbjsgUEFERElORy1CT1RUT006IDBpbjsgTUFSR0lO OiAwaW4gMGluIDBwdDsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25lOyBQQURESU5HLVRPUDogMGlu OyBCT1JERVItQk9UVE9NOiBtZWRpdW0gbm9uZSI+PGI+PHNwYW4gbGFuZz0iQVItRUciIGRpcj0i cnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogYmxhY2s7IEZPTlQtRkFNSUxZOiBU YWhvbWEiPt7Y2skgw9HWIMjH4ePRzCDj08fNySAxNzcg48rRINrh7CDUx9HaINHG7dPsPHNwYW4+ Jm5ic3A7IDwvc3Bhbj7K1eHNIOHI5MfBIOPOyNIg5ubNz8fKINPf5O3JPC9zcGFuPjwvYj48L3A+ CjwvZGl2Pgo8cCBzdHlsZT0iTUFSR0lOOiAwaW4gMGluIDBwdCI+PGI+PHNwYW4gbGFuZz0iQVIt RUciIGRpcj0icnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogIzMzNjZmZjsgRk9O VC1GQU1JTFk6IFRhaG9tYSI+x+Ha0dY4Ojwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItRUci IGRpcj0icnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogYmxhY2s7IEZPTlQtRkFN SUxZOiBUYWhvbWEiPiA8L3NwYW4+PC9iPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIg c3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6IGZ1Y2hzaWE7IEZPTlQtRkFNSUxZOiBUYWhv bWEiPjxzcGFuPiZuYnNwOyZuYnNwOzwvc3Bhbj7hx9XNx8ggx+Hj1MfR7dogx+HKzMfR7ck8c3Bh bj4mbmJzcDsgPC9zcGFuPsfkyuXSIMfh3dHVySDT2tEgx+HjytE4MDA8L3NwYW4+PC9iPjxiPjxz cGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6 IGJsYWNrOyBGT05ULUZBTUlMWTogVGFob21hIj48L3NwYW4+PC9iPjwvcD4KCjxwIHN0eWxlPSJN QVJHSU46IDBpbiAwaW4gMHB0Ij48Yj48c3BhbiBsYW5nPSJBUi1FRyIgZGlyPSJydGwiIHN0eWxl PSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiBibGFjazsgRk9OVC1GQU1JTFk6IFRhaG9tYSI+zCDH 0dYyMzLjIMjH4cfT48fa7eHtySA8L3NwYW4+PC9iPjwvcD4KPHAgc3R5bGU9Ik1BUkdJTjogMGlu IDBpbiAwcHQiPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9IkZPTlQtU0la RTogMTBwdDsgQ09MT1I6IGJsYWNrOyBGT05ULUZBTUlMWTogVGFob21hIj7h4cjt2iDH0dYgytXh zSDhx97H48kg49TR5togyszH0ewgyMfhx9Pjx9rt4e3JIDwvc3Bhbj48L2I+PC9wPgo8cCBzdHls ZT0iTUFSR0lOOiAwaW4gMGluIDBwdCI+PGI+PHNwYW4gbGFuZz0iQVItRUciIGRpcj0icnRsIiBz dHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogYmxhY2s7IEZPTlQtRkFNSUxZOiBUYWhvbWEi PiZuYnNwOzwvc3Bhbj48L2I+PC9wPgo8ZGl2IHN0eWxlPSJCT1JERVItUklHSFQ6IG1lZGl1bSBu b25lOyBQQURESU5HLVJJR0hUOiAwaW47IEJPUkRFUi1UT1A6IG1lZGl1bSBub25lOyBQQURESU5H LUxFRlQ6IDBpbjsgUEFERElORy1CT1RUT006IDFwdDsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25l OyBQQURESU5HLVRPUDogMGluOyBCT1JERVItQk9UVE9NOiB3aW5kb3d0ZXh0IDEuNXB0IHNvbGlk Ij4KPHAgc3R5bGU9IkJPUkRFUi1SSUdIVDogbWVkaXVtIG5vbmU7IFBBRERJTkctUklHSFQ6IDBp bjsgQk9SREVSLVRPUDogbWVkaXVtIG5vbmU7IFBBRERJTkctTEVGVDogMGluOyBQQURESU5HLUJP VFRPTTogMGluOyBNQVJHSU46IDBpbiAwaW4gMHB0OyBCT1JERVItTEVGVDogbWVkaXVtIG5vbmU7 IFBBRERJTkctVE9QOiAwaW47IEJPUkRFUi1CT1RUT006IG1lZGl1bSBub25lIj48Yj48c3BhbiBs YW5nPSJBUi1FRyIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiBibGFj azsgRk9OVC1GQU1JTFk6IFRhaG9tYSI+5sfR1iDHztHsIN7Y2skgw9HWIOPTx83K5ccgMjMwIOPK 0SDIx+Ha0e3U7ckgyMzmx9Eg49PMzyDH4dTtziDN0+QgytXhzSDhyOTHwSDjzsjSICZuYnNwO+bm zc/HyiDT3+TtySA8L3NwYW4+PC9iPjwvcD4KPC9kaXY+CjxwIHN0eWxlPSJNQVJHSU46IDBpbiAw aW4gMHB0Ij48Yj48c3BhbiBsYW5nPSJBUi1FRyIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJWkU6 IDEwcHQ7IENPTE9SOiAjMzM2NmZmOyBGT05ULUZBTUlMWTogVGFob21hIj7H4drR1jk6PHNwYW4+ Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48L3NwYW4+PC9iPjxiPjxzcGFuIGxhbmc9IkFSLUVH IiBkaXI9InJ0bCIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6IGZ1Y2hzaWE7IEZPTlQt RkFNSUxZOiBUYWhvbWEiPsfR1iAxNTDjIMjH4ePkx+3dIMjH4cfT48fa7eHtyTwvc3Bhbj48L2I+ PGI+PHNwYW4gbGFuZz0iQVItRUciIGRpcj0icnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBD T0xPUjogYmxhY2s7IEZPTlQtRkFNSUxZOiBUYWhvbWEiPiA8L3NwYW4+PC9iPjwvcD4KCjxkaXYg c3R5bGU9IkJPUkRFUi1SSUdIVDogbWVkaXVtIG5vbmU7IFBBRERJTkctUklHSFQ6IDBpbjsgQk9S REVSLVRPUDogbWVkaXVtIG5vbmU7IFBBRERJTkctTEVGVDogMGluOyBQQURESU5HLUJPVFRPTTog MXB0OyBCT1JERVItTEVGVDogbWVkaXVtIG5vbmU7IFBBRERJTkctVE9QOiAwaW47IEJPUkRFUi1C T1RUT006IHdpbmRvd3RleHQgMS41cHQgc29saWQiPgo8cCBzdHlsZT0iQk9SREVSLVJJR0hUOiBt ZWRpdW0gbm9uZTsgUEFERElORy1SSUdIVDogMGluOyBCT1JERVItVE9QOiBtZWRpdW0gbm9uZTsg UEFERElORy1MRUZUOiAwaW47IFBBRERJTkctQk9UVE9NOiAwaW47IE1BUkdJTjogMGluIDBpbiAw cHQ7IEJPUkRFUi1MRUZUOiBtZWRpdW0gbm9uZTsgUEFERElORy1UT1A6IDBpbjsgQk9SREVSLUJP VFRPTTogbWVkaXVtIG5vbmUiPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9 IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6IGJsYWNrOyBGT05ULUZBTUlMWTogVGFob21hIj7h4cjt 2iDH0dYg48jH5OwgyMfh4+TH7d0g38fj4ckgx+Hj0cfd3iDH0dYgyt7T7eMg09rR5ccgNjDH4d0g zOTt5SDj1dHsIN3e2CDhxyDb7dE8L3NwYW4+PC9iPjwvcD4KPC9kaXY+CjxwIHN0eWxlPSJNQVJH SU46IDBpbiAwaW4gMHB0Ij48Yj48c3BhbiBsYW5nPSJBUi1FRyIgZGlyPSJydGwiIHN0eWxlPSJG T05ULVNJWkU6IDEwcHQ7IENPTE9SOiAjMzM2NmZmOyBGT05ULUZBTUlMWTogVGFob21hIj7H4drR 1jEwOjwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItRUciIGRpcj0icnRsIiBzdHlsZT0iRk9O VC1TSVpFOiAxMHB0OyBDT0xPUjogYmxhY2s7IEZPTlQtRkFNSUxZOiBUYWhvbWEiPjxzcGFuPiZu YnNwOyZuYnNwOyA8L3NwYW4+PC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1FRyIgZGlyPSJy dGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiBmdWNoc2lhOyBGT05ULUZBTUlMWTog VGFob21hIj7H0dYgyMfN0+Qg4+TH2N4gyMjk5ccgPC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJB Ui1FRyIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiBibGFjazsgRk9O VC1GQU1JTFk6IFRhaG9tYSI+PC9zcGFuPjwvYj48L3A+Cgo8ZGl2IHN0eWxlPSJCT1JERVItUklH SFQ6IG1lZGl1bSBub25lOyBQQURESU5HLVJJR0hUOiAwaW47IEJPUkRFUi1UT1A6IG1lZGl1bSBu b25lOyBQQURESU5HLUxFRlQ6IDBpbjsgUEFERElORy1CT1RUT006IDFwdDsgQk9SREVSLUxFRlQ6 IG1lZGl1bSBub25lOyBQQURESU5HLVRPUDogMGluOyBCT1JERVItQk9UVE9NOiB3aW5kb3d0ZXh0 IDEuNXB0IHNvbGlkIj4KPHAgc3R5bGU9IkJPUkRFUi1SSUdIVDogbWVkaXVtIG5vbmU7IFBBRERJ TkctUklHSFQ6IDBpbjsgQk9SREVSLVRPUDogbWVkaXVtIG5vbmU7IFBBRERJTkctTEVGVDogMGlu OyBQQURESU5HLUJPVFRPTTogMGluOyBNQVJHSU46IDBpbiAwaW4gMHB0OyBCT1JERVItTEVGVDog bWVkaXVtIG5vbmU7IFBBRERJTkctVE9QOiAwaW47IEJPUkRFUi1CT1RUT006IG1lZGl1bSBub25l Ij48Yj48c3BhbiBsYW5nPSJBUi1FRyIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7 IENPTE9SOiBibGFjazsgRk9OVC1GQU1JTFk6IFRhaG9tYSI+4eHI7dogx9HWIMjI5OXHIOPTx83K 5ccgNDgy4yDIx93W4SDH4ePkx9jeINPa0SDH4ePK0SA3MDAwzCDh4ePK0Twvc3Bhbj48L2I+PC9w Pgo8L2Rpdj4KPHAgc3R5bGU9Ik1BUkdJTjogMGluIDBpbiAwcHQiPjxiPjxzcGFuIGxhbmc9IkFS LUVHIiBkaXI9InJ0bCIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICMzMzY2ZmY7IEZP TlQtRkFNSUxZOiBUYWhvbWEiPsfh2tHWMTE6PC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1F RyIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiBibGFjazsgRk9OVC1G QU1JTFk6IFRhaG9tYSI+PHNwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48L3NwYW4+PC9i PjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsg Q09MT1I6IGZ1Y2hzaWE7IEZPTlQtRkFNSUxZOiBUYWhvbWEiPsfR1iDh4cjt2iDa4ewg2NHt3iDH 09/kz9HtySDH4dXN0cfm7DxzcGFuPiZuYnNwOyA8L3NwYW4+z8fO4SDf5uPI5uTPPC9zcGFuPjwv Yj48Yj48c3BhbiBsYW5nPSJBUi1FRyIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7 IENPTE9SOiBibGFjazsgRk9OVC1GQU1JTFk6IFRhaG9tYSI+PC9zcGFuPjwvYj48L3A+Cgo8cCBz dHlsZT0iTUFSR0lOOiAwaW4gMGluIDBwdCI+PGI+PHNwYW4gbGFuZz0iQVItRUciIGRpcj0icnRs IiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogYmxhY2s7IEZPTlQtRkFNSUxZOiBUYWhv bWEiPuHhyO3aIMfR1iDj08fNyuXHIN3Px+Qg38fj4SDa4ewg2NHt3iDH09/kz9HtySDH4dXN0cfm 7CDH4d/t4eY1ODxzcGFuPiZuYnNwOyA8L3NwYW4+z8fO4SDf5uPI5uTPIOPTx83K5ccg3c/H5CDH 7CA0MjAwIOPK0SDH4dPa0SDUx+PhIM7YIMfh3+XRyMfBIObH4ePtx8k8L3NwYW4+PC9iPjwvcD4K CjxkaXYgc3R5bGU9IkJPUkRFUi1SSUdIVDogbWVkaXVtIG5vbmU7IFBBRERJTkctUklHSFQ6IDBp bjsgQk9SREVSLVRPUDogbWVkaXVtIG5vbmU7IFBBRERJTkctTEVGVDogMGluOyBQQURESU5HLUJP VFRPTTogMXB0OyBCT1JERVItTEVGVDogbWVkaXVtIG5vbmU7IFBBRERJTkctVE9QOiAwaW47IEJP UkRFUi1CT1RUT006IHdpbmRvd3RleHQgMS41cHQgc29saWQiPgo8cCBzdHlsZT0iQk9SREVSLVJJ R0hUOiBtZWRpdW0gbm9uZTsgUEFERElORy1SSUdIVDogMGluOyBCT1JERVItVE9QOiBtZWRpdW0g bm9uZTsgUEFERElORy1MRUZUOiAwaW47IFBBRERJTkctQk9UVE9NOiAwaW47IE1BUkdJTjogMGlu IDBpbiAwcHQ7IEJPUkRFUi1MRUZUOiBtZWRpdW0gbm9uZTsgUEFERElORy1UT1A6IDBpbjsgQk9S REVSLUJPVFRPTTogbWVkaXVtIG5vbmUiPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIg c3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6IGJsYWNrOyBGT05ULUZBTUlMWTogVGFob21h Ij7H4dPa0SDH4ePY4ebIIDQ1MMfh3SDM5O3lIOPV0ewgPC9zcGFuPjwvYj48L3A+CjwvZGl2Pgo8 cCBzdHlsZT0iTUFSR0lOOiAwaW4gMGluIDBwdCAxNzFwdCI+PGI+PHNwYW4gbGFuZz0iQVItRUci IGRpcj0icnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogYmxhY2s7IEZPTlQtRkFN SUxZOiBUYWhvbWEiPjxzcGFuPiZuYnNwOyZuYnNwOyA8L3NwYW4+PHNwYW4+Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwv c3Bhbj48L3NwYW4+PC9iPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9IkZP TlQtU0laRTogMTBwdDsgQ09MT1I6IHJlZDsgRk9OVC1GQU1JTFk6IFRhaG9tYSI+3dHVySDh5CDK yt/R0SDH0dYgyszH0e3JyMzmx9Egx+HMx+PaySDH4cfj0e3f7ck8L3NwYW4+PC9iPjwvcD4KCjxk aXYgc3R5bGU9IkJPUkRFUi1SSUdIVDogbWVkaXVtIG5vbmU7IFBBRERJTkctUklHSFQ6IDBpbjsg Qk9SREVSLVRPUDogbWVkaXVtIG5vbmU7IFBBRERJTkctTEVGVDogMGluOyBQQURESU5HLUJPVFRP TTogMXB0OyBNQVJHSU4tTEVGVDogMmluOyBCT1JERVItTEVGVDogbWVkaXVtIG5vbmU7IE1BUkdJ Ti1SSUdIVDogMGluOyBQQURESU5HLVRPUDogMGluOyBCT1JERVItQk9UVE9NOiB3aW5kb3d0ZXh0 IDEuNXB0IHNvbGlkIj4KCjxwIHN0eWxlPSJCT1JERVItUklHSFQ6IG1lZGl1bSBub25lOyBQQURE SU5HLVJJR0hUOiAwaW47IEJPUkRFUi1UT1A6IG1lZGl1bSBub25lOyBQQURESU5HLUxFRlQ6IDBp bjsgUEFERElORy1CT1RUT006IDBpbjsgTUFSR0lOOiAwaW4gMGluIDBwdDsgQk9SREVSLUxFRlQ6 IG1lZGl1bSBub25lOyBQQURESU5HLVRPUDogMGluOyBCT1JERVItQk9UVE9NOiBtZWRpdW0gbm9u ZSI+PGI+PHNwYW4gbGFuZz0iQVItRUciIGRpcj0icnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0 OyBDT0xPUjogYmxhY2s7IEZPTlQtRkFNSUxZOiBUYWhvbWEiPuHhyO3aIMfR1iDh3tjJIMrMx9Ht ySDIx+Hex+XRySDH4czP7c/JIMjH4crM49ogx+HOx+PTIMjM5sfRIMfhzMfj2skgx+HH49Ht3+3J IOPK4+3SySDMz8cg4+be2iDKzMfR7CDRx8baIOPTx83K5ccgODDH4d0g48rRIOPRyNog7ebMzyDP 0cfTySDMz+bsIOPkINTR38kg2sfh4+3JIOHH3sfjySDj5uEgyszH0ewgx+HT2tEgx+Hj2OHmyCDh 4ePK0SDRx8baIN/m5OXHIMrMx9HsIDQwMDDM5O3lIOPV0ewg3d7YIObt5szPIN7Y2iDH0cfW7CDH ztHsIMjT5tHtxyDm3tjRIObH4cjN0e3kIObH4cfjx9HHyiDmx+HT2ubP7ck8L3NwYW4+PC9iPjxi PjxzcGFuIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiBibGFjazsgRk9OVC1GQU1JTFk6 IFRhaG9tYSI+PC9zcGFuPjwvYj48L3A+CjwvZGl2Pgo8cCBzdHlsZT0iTUFSR0lOOiAwaW4gMGlu IDBwdCAxLjc1aW4iPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9IkZPTlQt U0laRTogMTBwdDsgQ09MT1I6IGJsdWU7IEZPTlQtRkFNSUxZOiBUYWhvbWEiPuHRx9vI7CDU3t4g 5t3h4SDex+Tm5CDMz+3PIMjPx+3J4+QgNjAwzOTt5TxzcGFuPiZuYnNwOyA8L3NwYW4+yMfh1NHm 3iDm49XRIMfhzM/tz8kg5uPP7eTJIOTV0SDmx+HKzOPaIObH4ePe2OMgPHNwYW4+Jm5ic3A7PC9z cGFuPubU7dHHyubkIMjj08fNx8og487K4d3JPHNwYW4+Jm5ic3A7IDwvc3Bhbj48L3NwYW4+PC9i PjwvcD4KCjxwIGRpcj0icnRsIiBzdHlsZT0iRElSRUNUSU9OOiBydGw7IE1BUkdJTi1SSUdIVDog MjguMTVwdDsgVEVYVC1BTElHTjogcmlnaHQiPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBzdHlsZT0i Rk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogI2ZmNjYwMDsgRk9OVC1GQU1JTFk6IEFyaWFsIj7H4drR 1iAxOjwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItU0EiIHN0eWxlPSJGT05ULVNJWkU6IDEw cHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PHNwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48 L3NwYW4+PC9iPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBzdHlsZT0iQ09MT1I6IGJsdWU7IEZPTlQt RkFNSUxZOiBBcmlhbCI+1N7JIMjT2tE8L3NwYW4+PC9iPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBz dHlsZT0iQ09MT1I6IGJsdWU7IEZPTlQtRkFNSUxZOiBBcmlhbCI+4d7YyTwvc3Bhbj48L2I+PGI+ PHNwYW4gbGFuZz0iQVItU0EiIHN0eWxlPSJDT0xPUjogYmx1ZTsgRk9OVC1GQU1JTFk6IEFyaWFs Ij4gNjAwzOTt5SDIx+HU0ebeIMjM5sfRIOTHz+wg5eHt5sjh7dM8L3NwYW4+PC9iPjxzcGFuIGRp cj0ibHRyIj48L3NwYW4+PGI+PHNwYW4gZGlyPSJsdHIiIHN0eWxlPSJGT05ULUZBTUlMWTogQXJp YWwiPjxzcGFuIGRpcj0ibHRyIj48L3NwYW4+PHNwYW4+Jm5ic3A7IDwvc3Bhbj48L3NwYW4+PC9i PjxiPjxzcGFuIGRpcj0ibHRyIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTog QXJpYWwiPjxzcGFuPiZuYnNwOzwvc3Bhbj48L3NwYW4+PC9iPjxiPjxzcGFuIGxhbmc9IkFSLVNB IiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogQXJpYWwiPjwvc3Bhbj48L2I+ PC9wPgoKPHAgZGlyPSJydGwiIHN0eWxlPSJESVJFQ1RJT046IHJ0bDsgTUFSR0lOLVJJR0hUOiAy OC4xNXB0OyBURVhULUFMSUdOOiByaWdodCI+PGI+PHNwYW4gbGFuZz0iQVItU0EiIHN0eWxlPSJG T05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+x+HU3uUgyMfT38fkIOPIx9HfIMjM 5sfRIOTHz+wg5eHt5sjh7dMgx+HMz+3PIObkx9XtySDMz+3PySDK1NjtyCDT5sjRIOHm39Mg4eMg ytPK2uPhINrh7CDNz+3eySDIx+HP5tEgx+HH0dbsIOPTx83JIDEzMOMg2sjH0eUg2uQgMuTm4yDm M9HTyNTkIObN48fjIObj2MjOIObI4d/m5CDmx+HT2tEgx+Hj2OHmyCDh5CDtyt/R0SDd3tggNjAw zOTt5SDj1dHsIDwvc3Bhbj48L2I+PC9wPgoKPHAgZGlyPSJydGwiIHN0eWxlPSJESVJFQ1RJT046 IHJ0bDsgTUFSR0lOLVJJR0hUOiAyOC4xNXB0OyBURVhULUFMSUdOOiByaWdodCI+PGI+PHNwYW4g bGFuZz0iQVItU0EiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiAjZmY2NjAwOyBGT05U LUZBTUlMWTogQXJpYWwiPsfh2tHWMjo8L3NwYW4+PC9iPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBz dHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogQXJpYWwiPjxzcGFuPiZuYnNwOyZu YnNwOyA8L3NwYW4+PC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkNPTE9S OiBibHVlOyBGT05ULUZBTUlMWTogQXJpYWwiPtTeySDPx87hIN/m48jm5M8g5sfP7CDH4dHI7dog yMfh1NHm3jwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItU0EiIHN0eWxlPSJGT05ULVNJWkU6 IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PC9zcGFuPjwvYj48L3A+Cgo8cCBkaXI9InJ0bCIg c3R5bGU9IkRJUkVDVElPTjogcnRsOyBNQVJHSU4tUklHSFQ6IDI4LjE1cHQ7IFRFWFQtQUxJR046 IHJpZ2h0Ij48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9O VC1GQU1JTFk6IEFyaWFsIj7H4dTe5SDI4+be2iDjyuPt0iDIzObH0SDkx8/sIOXh7ebI4e3TIMfh zM/tzzwvc3Bhbj48L2I+PHNwYW4gZGlyPSJsdHIiPjwvc3Bhbj48Yj48c3BhbiBsYW5nPSJBUi1T QSIgZGlyPSJsdHIiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+ PHNwYW4gZGlyPSJsdHIiPjwvc3Bhbj4gPC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1TQSIg c3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj7O4d0g4cThxMkgx+HU 0ebeIObH7dbHIM/HzuEg3+bjyObkzyDj38rj4SDH4c7P48fKIObH4ePRx93eIOPTx83JIDEzNOMg 2sjH0eUg2uQgM+Tm4yDmMtHTyNTkIDLmzePH4yDm49jIziDmyOHf5uQgx+HT2tEgMTIwMMzk7eUg 49XR7CA8L3NwYW4+PC9iPjwvcD4KCjxwIGRpcj0icnRsIiBzdHlsZT0iRElSRUNUSU9OOiBydGw7 IE1BUkdJTi1SSUdIVDogMjguMTVwdDsgVEVYVC1BTElHTjogcmlnaHQiPjxiPjxzcGFuIGxhbmc9 IkFSLVNBIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogI2ZmNjYwMDsgRk9OVC1GQU1J TFk6IEFyaWFsIj7H4drR1jM6PC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9 IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj48c3Bhbj4mbmJzcDsmbmJzcDsg PC9zcGFuPjwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItU0EiIHN0eWxlPSJDT0xPUjogYmx1 ZTsgRk9OVC1GQU1JTFk6IEFyaWFsIj7U3skyMDDjIN7H5ObkIMzP7c8gyNTH0dogx+HL5tHJIMfh 0cbt0+wgyOPV0SDH4czP7c/JPC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9 IkZPTlQtRkFNSUxZOiBBcmlhbCI+IDwvc3Bhbj48L2I+PC9wPgoKPHAgZGlyPSJydGwiIHN0eWxl PSJESVJFQ1RJT046IHJ0bDsgTUFSR0lOLVJJR0hUOiAyOC4xNXB0OyBURVhULUFMSUdOOiByaWdo dCI+PGI+PHNwYW4gbGFuZz0iQVItU0EiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFN SUxZOiBBcmlhbCI+4eHH7czH0SDU3uUgyNrjx9HHyiDH4dTR38kgx+HT2ubP7ckgyNTH0dogx+HL 5tHJIMfh48fZySDm5ewg7cfhz+bRIMfhysfk7CDj08fNySAyMDDjINrIx9HlINrkIDPk5uMg5jTR 08jU5CDmM83jx+Mg5jLI4d/m5CDm7ebMzyDb0d3JIOPH08rRIObjytTYyOUgyMfR3+3lIObI5tHT 4e3kPHNwYW4+Jm5ic3A7IDwvc3Bhbj7m49jh5sgg3e3lxyAxNzUwzOTt5SDj1dHsIDwvc3Bhbj48 L2I+PC9wPgoKPHAgZGlyPSJydGwiIHN0eWxlPSJESVJFQ1RJT046IHJ0bDsgTUFSR0lOLVJJR0hU OiAyOC4xNXB0OyBURVhULUFMSUdOOiByaWdodCI+PGI+PHNwYW4gbGFuZz0iQVItU0EiIHN0eWxl PSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiAjZmY2NjAwOyBGT05ULUZBTUlMWTogQXJpYWwiPsfh 2tHWNDo8L3NwYW4+PC9iPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBzdHlsZT0iRk9OVC1TSVpFOiAx MHB0OyBGT05ULUZBTUlMWTogQXJpYWwiPjxzcGFuPiZuYnNwOyA8L3NwYW4+PC9zcGFuPjwvYj48 Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkNPTE9SOiBibHVlOyBGT05ULUZBTUlMWTogQXJp YWwiPtTeySDRx8baySAxODDjIMfh3e3mINrh7CDkx8/sIMfh2O3Rx+Qg48jH1NHJIMjj1dEgx+HM z+3PyTwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItU0EiIHN0eWxlPSJGT05ULVNJWkU6IDEw cHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PC9zcGFuPjwvYj48L3A+Cgo8cCBkaXI9InJ0bCIgc3R5 bGU9IkRJUkVDVElPTjogcnRsOyBNQVJHSU4tUklHSFQ6IDI4LjE1cHQ7IFRFWFQtQUxJR046IHJp Z2h0Ij48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1G QU1JTFk6IEFyaWFsIj7h4cftzMfRIN7H5ObkIMzP7c8g1N7JIMjTx+TKIN3Hyu3jxyDH4d3t5iDH 38vRIOPkINHHxtog2uHsIOTHz+wgx+HY7dHH5CDI1MfR2iDHzePPIN3Ex88gx+HRxu3T7CDj08fN ySAxODDjIObH4dXH3ewgMTYw4yDayMfR5SDa5CAy5ObjIOYz0dPI1OQg5s3jx+Mg5uPYyM4gytTY 7cgg0+3Rx+Pt3yDf4eXHIObf0cfk7dQgyMfh097dIM/HzuHlxyDIx+Tm5cfKIMjH4c/m0SDH4dHH yNog5sfh2t7H0TXHz+bH0SDmx+HT2tEgx+Hj2OHmyCAyMjUwzOTt5SDj1dHsPC9zcGFuPjwvYj48 L3A+Cgo8cCBkaXI9InJ0bCIgc3R5bGU9IkRJUkVDVElPTjogcnRsOyBNQVJHSU4tUklHSFQ6IDI4 LjE1cHQ7IFRFWFQtQUxJR046IHJpZ2h0Ij48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZP TlQtU0laRTogMTBwdDsgQ09MT1I6ICNmZjY2MDA7IEZPTlQtRkFNSUxZOiBBcmlhbCI+x+Ha0dY1 Ojwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItU0EiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7 IEZPTlQtRkFNSUxZOiBBcmlhbCI+PHNwYW4+Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48L3NwYW4+PC9i PjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBzdHlsZT0iQ09MT1I6IGJsdWU7IEZPTlQtRkFNSUxZOiBB cmlhbCI+1N7JIDIyMOMgyNrjx9HHyiDH4ePP3drtySDH48fjINPtyuwg08rH0dI8L3NwYW4+PC9i PjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlM WTogQXJpYWwiPjwvc3Bhbj48L2I+PC9wPgoKPHAgZGlyPSJydGwiIHN0eWxlPSJESVJFQ1RJT046 IHJ0bDsgTUFSR0lOLVJJR0hUOiAyOC4xNXB0OyBURVhULUFMSUdOOiByaWdodCI+PGI+PHNwYW4g bGFuZz0iQVItU0EiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+ 4eHH7czH0SDex+Tm5CDMz+3PIMfjx+Mg0+3K7CDTysfR0iDP5tE5IMgy49XazyDayMfR5SDa5CAz 5ObjIOYz0dPI1OQg5s3jx+Mg5uPYyM4g5sjh3+bkIMrU2O3IIMjH0d/t5SDm0+3Rx+Pt3yDa48fR x8og1O3fIMzPxyDH4d3t5iDRx8baIMfh09rRIMfh49jh5sggMjUwMMzk7eUg49XR7Dwvc3Bhbj48 L2I+PC9wPgoKPHAgZGlyPSJydGwiIHN0eWxlPSJESVJFQ1RJT046IHJ0bDsgTUFSR0lOLVJJR0hU OiAyOC4xNXB0OyBURVhULUFMSUdOOiByaWdodCI+PGI+PHNwYW4gbGFuZz0iQVItU0EiIHN0eWxl PSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiAjZmY2NjAwOyBGT05ULUZBTUlMWTogQXJpYWwiPsfh 2tHWNjo8L3NwYW4+PC9iPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBzdHlsZT0iRk9OVC1TSVpFOiAx MHB0OyBGT05ULUZBTUlMWTogQXJpYWwiPjxzcGFuPiZuYnNwOyZuYnNwOyA8L3NwYW4+PC9zcGFu PjwvYj48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkNPTE9SOiBibHVlOyBGT05ULUZBTUlM WTogQXJpYWwiPtTeySAxNTDjIM7h3SDkx8/sIMfh5NXRIOHM4+3aIMfhx9vRx9YgyOPV0SDH4czP 7c/JPC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZPTlQtRkFNSUxZOiBB cmlhbCI+PC9zcGFuPjwvYj48L3A+Cgo8cCBkaXI9InJ0bCIgc3R5bGU9IkRJUkVDVElPTjogcnRs OyBNQVJHSU4tUklHSFQ6IDI4LjE1cHQ7IFRFWFQtQUxJR046IHJpZ2h0Ij48Yj48c3BhbiBsYW5n PSJBUi1TQSIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj7h4cft zMfRIN7H5ObkIMzP7c8g1N7JIMjUx9HaINrh7CDd5ePJIN/H4+Egz+bRIMfm4SDK1eHN0yDT3+Qg 497RIMfPx9HsIOHM4+3aIMfhx9vRx9Yg2sjH0eUg2uQgM+Tm4yDmMtHTyNTkIOYyzePH4yDm49jI ziDmyOHf5uQgytTY7cgg0+3Rx+Pt3yDP5cfkx8ogzc/ty8kgx+HT2tEgx+Hj2OHmyDMwMDDM5O3l IOPV0ewgPC9zcGFuPjwvYj48L3A+Cgo8cCBkaXI9InJ0bCIgc3R5bGU9IkRJUkVDVElPTjogcnRs OyBNQVJHSU4tUklHSFQ6IDI4LjE1cHQ7IFRFWFQtQUxJR046IHJpZ2h0Ij48Yj48c3BhbiBsYW5n PSJBUi1TQSIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICNmZjY2MDA7IEZPTlQtRkFN SUxZOiBBcmlhbCI+x+Ha0dY3Ojwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItU0EiIHN0eWxl PSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PHNwYW4+Jm5ic3A7Jm5ic3A7 IDwvc3Bhbj48c3BhbiBzdHlsZT0iQ09MT1I6IGJsdWUiPtTeySDHz8fR7CDI4+be2iDN7ebsIMzP xyDa4ewg4+3Px+QgytHt490g2uHsINTH0dogx+Hk0uXJIMfh0cbt0+w8L3NwYW4+PC9zcGFuPjwv Yj48L3A+Cgo8cCBkaXI9InJ0bCIgc3R5bGU9IkRJUkVDVElPTjogcnRsOyBNQVJHSU4tUklHSFQ6 IDI4LjE1cHQ7IFRFWFQtQUxJR046IHJpZ2h0Ij48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9 IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj7U3skg3sfk5uQgzM/tzyDIx+HP 5tEgx+HKx+TsIN/j3tEg1NHfySDHz8fR7CDj08fNySAxODDjINrIx9HlINrkIDPb0d0g5jPR08jU 5CDmzePH4yDm49jIziDK1NjtyCDI4cfYIOPH0sft3+Yg5s3jx+Mg5uPYyM4g0+3Rx+Pt3yDH4dPa 0SDH4ePY4ebIIDM1MDDM5O3lIOPV0ewgPC9zcGFuPjwvYj48L3A+Cgo8cCBkaXI9InJ0bCIgc3R5 bGU9IkRJUkVDVElPTjogcnRsOyBNQVJHSU4tUklHSFQ6IDI4LjE1cHQ7IFRFWFQtQUxJR046IHJp Z2h0Ij48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6 ICNmZjY2MDA7IEZPTlQtRkFNSUxZOiBBcmlhbCI+x+Ha0dY4Ojwvc3Bhbj48L2I+PGI+PHNwYW4g bGFuZz0iQVItU0EiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+ PHNwYW4+Jm5ic3A7IDwvc3Bhbj48L3NwYW4+PC9iPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBzdHls ZT0iQ09MT1I6IGJsdWU7IEZPTlQtRkFNSUxZOiBBcmlhbCI+1N7JIM/m0SDH0dbsMjIw4yDI3+Ht 5SDH4cjkx8ogytXhzSDhzOPt2iDH4cfb0cfWPC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1T QSIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj4gPC9zcGFuPjwv Yj48L3A+Cgo8cCBkaXI9InJ0bCIgc3R5bGU9IkRJUkVDVElPTjogcnRsOyBNQVJHSU4tUklHSFQ6 IDI4LjE1cHQ7IFRFWFQtQUxJR046IHJpZ2h0Ij48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9 IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj7h4cftzMfRIN7H5ObkIMzP7c8g yN/h7eUgx+HI5MfKIMfR1uwg49HK3dogyOPPzuEgzsfVINrIx9HlINrkIDXb0d0g5jPR08jU5CDm Ms3jx+Mg5uPYyM4g5sjh3+bkIMrU2O3IINPt0cfj7d8g5srV4c0g09/k7CDH5iDHz8fR7CDH5iDN 1sfk5SDhx+TlxyDH4cfkIM3Wx+TlIMfh09rRNjAwMMzk7eUg49XR7CA8L3NwYW4+PC9iPjwvcD4K CjxwIGRpcj0icnRsIiBzdHlsZT0iRElSRUNUSU9OOiBydGw7IE1BUkdJTi1SSUdIVDogMjguMTVw dDsgVEVYVC1BTElHTjogcmlnaHQiPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBzdHlsZT0iRk9OVC1T SVpFOiAxMHB0OyBDT0xPUjogI2ZmNjYwMDsgRk9OVC1GQU1JTFk6IEFyaWFsIj7H4drR1jk6PC9z cGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCI+ IDxzcGFuIHN0eWxlPSJDT0xPUjogYmx1ZSI+3dHVySDU3uUg3sfk5uQgzM/tzyDI7eQg2sjH0yDm 49/R4yDayO3PPC9zcGFuPjwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItU0EiIHN0eWxlPSJG T05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PC9zcGFuPjwvYj48L3A+Cgo8cCBk aXI9InJ0bCIgc3R5bGU9IkRJUkVDVElPTjogcnRsOyBNQVJHSU4tUklHSFQ6IDI4LjE1cHQ7IFRF WFQtQUxJR046IHJpZ2h0Ij48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZPTlQtU0laRTog MTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj7U3skg49PHzckgMjMw4yDI48/t5Mkg5NXRIMfh4+TY 3skgx+HTx8/TySDayMfR5SDa5CAz5ObjIOY00dPI1OQg5jLN48fjIObj2MjOIObI4d/m5CDIx+HP 5tEgx+HRx8jaIMrU2O3IIMjhx9gg2sfP7CDmx+HN48fjIObH4ePYyM4g0+3Rx+Pt3yDmytXhzSDT 3+Qgx+Yg49/KyCDj2OHmyCAxODAwzOTt5SDj1dHsPC9zcGFuPjwvYj48L3A+Cgo8cCBkaXI9InJ0 bCIgc3R5bGU9IkRJUkVDVElPTjogcnRsOyBNQVJHSU4tUklHSFQ6IDI4LjE1cHQ7IFRFWFQtQUxJ R046IHJpZ2h0Ij48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsg Q09MT1I6ICNmZjY2MDA7IEZPTlQtRkFNSUxZOiBBcmlhbCI+x+Ha0dYxMDo8L3NwYW4+PC9iPjxi PjxzcGFuIGxhbmc9IkFSLVNBIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTog QXJpYWwiPjxzcGFuPiZuYnNwOyZuYnNwOyA8L3NwYW4+PC9zcGFuPjwvYj48Yj48c3BhbiBsYW5n PSJBUi1TQSIgc3R5bGU9IkNPTE9SOiBibHVlOyBGT05ULUZBTUlMWTogQXJpYWwiPtTeySDI09rR IOPb0ewgx9HW7CDIzc/t3skgzuHdIM3P7d7JIMfh2N3hIMja48fRySDMz+3PyTwvc3Bhbj48L2I+ PGI+PHNwYW4gbGFuZz0iQVItU0EiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZ OiBBcmlhbCI+PC9zcGFuPjwvYj48L3A+Cgo8cCBkaXI9InJ0bCIgc3R5bGU9IkRJUkVDVElPTjog cnRsOyBNQVJHSU4tUklHSFQ6IDI4LjE1cHQ7IFRFWFQtQUxJR046IHJpZ2h0Ij48Yj48c3BhbiBs YW5nPSJBUi1TQSIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj7U 3skg3sfk5uQgzM/tzyDO4d0gzc/t3skgx+HY3eEgyOPP7eTJIOTV0SDH0dbsIMjNz+3eySDO4d3t 5SDj08fNySAxMzDjINrIx9HlINrkIDXb0d0g5tXH4eUg5jLN48fjIObj2MjOIObI4d/m5CDm7ebM zyDM0cfMIM7H1SDI5cc8c3Bhbj4mbmJzcDsgPC9zcGFuPsfh09rRIN3e2CAyMDAwzOTt5SDj1dHs IDwvc3Bhbj48L2I+PC9wPgoKPHAgZGlyPSJydGwiIHN0eWxlPSJESVJFQ1RJT046IHJ0bDsgTUFS R0lOLVJJR0hUOiAyOC4xNXB0OyBURVhULUFMSUdOOiByaWdodCI+PGI+PHNwYW4gbGFuZz0iQVIt U0EiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiAjZmY2NjAwOyBGT05ULUZBTUlMWTog QXJpYWwiPsfh2tHWMTE6PC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZP TlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj48c3Bhbj4mbmJzcDsmbmJzcDsgPC9z cGFuPjwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItU0EiIHN0eWxlPSJDT0xPUjogYmx1ZTsg Rk9OVC1GQU1JTFk6IEFyaWFsIj7U3skg3sfk5uQgzM/tzyAxNzXjIMjH4crH09rJIMjjz+3kySDk 1dE8L3NwYW4+PC9iPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0 OyBGT05ULUZBTUlMWTogQXJpYWwiPjwvc3Bhbj48L2I+PC9wPgoKPHAgZGlyPSJydGwiIHN0eWxl PSJESVJFQ1RJT046IHJ0bDsgTUFSR0lOLVJJR0hUOiAyOC4xNXB0OyBURVhULUFMSUdOOiByaWdo dCI+PGI+PHNwYW4gbGFuZz0iQVItU0EiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFN SUxZOiBBcmlhbCI+4eHH7czH0SDU3skgyMfhz+bRIMfhzsfj0yDI2t7H0TExz+bRIMgy49XazyDa yMfR5SDa5CAz5ObjIOYz0dPI1OQg5jLN48fjIObj2MjOIObI4d/m5CDK1NjtyCDT7dHH4+3fIMfh 09rRIMfh49jh5sggMjUwMMzk7eUg49XR7CA8L3NwYW4+PC9iPjwvcD4KCjxwIGRpcj0icnRsIiBz dHlsZT0iRElSRUNUSU9OOiBydGw7IE1BUkdJTi1SSUdIVDogMjguMTVwdDsgVEVYVC1BTElHTjog cmlnaHQiPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xP UjogI2ZmNjYwMDsgRk9OVC1GQU1JTFk6IEFyaWFsIj7H4drR1jEyOjwvc3Bhbj48L2I+PGI+PHNw YW4gbGFuZz0iQVItU0EiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlh bCI+PHNwYW4+Jm5ic3A7IDwvc3Bhbj48L3NwYW4+PC9iPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBz dHlsZT0iQ09MT1I6IGJsdWU7IEZPTlQtRkFNSUxZOiBBcmlhbCI+1N7JIDIwMOMgyMzmx9Egx+HT 0cfMIM7h3SDH4ebkz9Eg4cfkzzwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItU0EiIHN0eWxl PSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PC9zcGFuPjwvYj48L3A+Cgo8 cCBkaXI9InJ0bCIgc3R5bGU9IkRJUkVDVElPTjogcnRsOyBNQVJHSU4tUklHSFQ6IDI4LjE1cHQ7 IFRFWFQtQUxJR046IHJpZ2h0Ij48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZPTlQtU0la RTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj7U3uUg3sfk5uQgzM/tzyDO4d0gx+Hm5M/RIOHH 5M8gyOPP7eTJIOTV0SDH4ePk2N7JIMfhy8fj5Mk8c3Bhbj4mbmJzcDsgPC9zcGFuPsjH4c/m0SDH 4dPHz9Mg5sfh2t7H0TjHz+bH0SDI49XazyDayMfR5SDa5CAz5ObjIOY00dPI1OQg5jLN48fjIObj 2MjOIObI4d/m5CDa4ewgx+HjzcfRySDmyOXHIOTMx9HJIObTyMffySDm3+XRyMfBIOPm3tog0cfe 7CDMz8cg5uXHz+wg5sfh09rRIMfh49jh5sggMjUwMMzk7eUg49XR7CA8L3NwYW4+PC9iPjwvcD4K CjxwIGRpcj0icnRsIiBzdHlsZT0iRElSRUNUSU9OOiBydGw7IE1BUkdJTi1SSUdIVDogMjguMTVw dDsgVEVYVC1BTElHTjogcmlnaHQiPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBzdHlsZT0iRk9OVC1T SVpFOiAxMHB0OyBDT0xPUjogI2ZmNjYwMDsgRk9OVC1GQU1JTFk6IEFyaWFsIj7H4drR1jEzOjwv c3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItU0EiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZP TlQtRkFNSUxZOiBBcmlhbCI+PHNwYW4+Jm5ic3A7IDwvc3Bhbj48L3NwYW4+PC9iPjxiPjxzcGFu IGxhbmc9IkFSLVNBIiBzdHlsZT0iQ09MT1I6IGJsdWU7IEZPTlQtRkFNSUxZOiBBcmlhbCI+4dHH 28jsIMfh09/kIN7H5ObkIMzP7c8gyOPm3tog48rj7dIg5tHH3uwgyOPP7eTJIOTV0Twvc3Bhbj48 L2I+PGI+PHNwYW4gbGFuZz0iQVItU0EiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFN SUxZOiBBcmlhbCI+PC9zcGFuPjwvYj48L3A+Cgo8cCBkaXI9InJ0bCIgc3R5bGU9IkRJUkVDVElP TjogcnRsOyBNQVJHSU4tUklHSFQ6IDI4LjE1cHQ7IFRFWFQtQUxJR046IHJpZ2h0Ij48Yj48c3Bh biBsYW5nPSJBUi1TQSIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFs Ij7U3skg4eHH7czH0SDIx+HT3cfRx8og4+be2iDj4+3SIOTH1e3JIMjI0cwg3c7jIMjH4c/m0SDH 4TMg5sfh2t7H0TExz+bRIMgy49XazyDj08fNySAxNzXjINrIx9HlINrkIDPk5uMg5jPR08jU5CDm Ms3jx+Mg5uPYyM4g5jPI4d/m5CDK1NjtyCDT7dHH4+3fIObj08rm7e3kIMfh09rRIDMwMDDM5O3l IOPV0ewgPC9zcGFuPjwvYj48L3A+Cgo8cCBkaXI9InJ0bCIgc3R5bGU9IkRJUkVDVElPTjogcnRs OyBNQVJHSU4tUklHSFQ6IDI4LjE1cHQ7IFRFWFQtQUxJR046IHJpZ2h0Ij48Yj48c3BhbiBsYW5n PSJBUi1TQSIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICNmZjY2MDA7IEZPTlQtRkFN SUxZOiBBcmlhbCI+x+Ha0dYxNDo8L3NwYW4+PC9iPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBzdHls ZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogQXJpYWwiPjxzcGFuPiZuYnNwOyZuYnNw OyA8L3NwYW4+PC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkNPTE9SOiBi bHVlOyBGT05ULUZBTUlMWTogQXJpYWwiPtTeySDex+Tm5CDMz+3PIDIwMOMg5MfV7ckgyOPP7eTJ IOTV0Twvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItU0EiIHN0eWxlPSJGT05ULVNJWkU6IDEw cHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PC9zcGFuPjwvYj48L3A+Cgo8cCBkaXI9InJ0bCIgc3R5 bGU9IkRJUkVDVElPTjogcnRsOyBNQVJHSU4tUklHSFQ6IDI4LjE1cHQ7IFRFWFQtQUxJR046IHJp Z2h0Ij48Yj48c3BhbiBsYW5nPSJBUi1TQSIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1G QU1JTFk6IEFyaWFsIj7h4cftzMfRINTeySDIx+HTx8jaySDI48/t5Mkg5NXRIM/m0SDKx+TsIObH 4drex9ExMc/m0SDIMuPV2s8g49PHzckgMjAw4yDayMfR5SDa5CAz5ObjIOYz0dPI1OQg5jLN48fj IObj2MjOIObI4d/m5CDK1NjtyCDT7dHH4+3fIObH4dPa0SDH4ePY4ebIIDMwMDDM5O3lIOPV0ewg PC9zcGFuPjwvYj48L3A+Cgo8cCBkaXI9InJ0bCIgc3R5bGU9IkRJUkVDVElPTjogcnRsOyBNQVJH SU4tUklHSFQ6IDI4LjE1cHQ7IFRFWFQtQUxJR046IHJpZ2h0Ij48Yj48c3BhbiBsYW5nPSJBUi1T QSIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICNmZjY2MDA7IEZPTlQtRkFNSUxZOiBB cmlhbCI+x+Ha0dYxNTo8L3NwYW4+PC9iPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBzdHlsZT0iRk9O VC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogQXJpYWwiPjxzcGFuPiZuYnNwOyZuYnNwOyA8L3Nw YW4+PHNwYW4gc3R5bGU9IkNPTE9SOiBibHVlIj7h0cfbyOwgx+HK4+3SIObH4d3Ox+PJIObH4dPf 5CDI1N7eIObd4eEgyMfhyszj2iDH4c7H49M8L3NwYW4+IDwvc3Bhbj48L2I+PC9wPgoKPHAgZGly PSJydGwiIHN0eWxlPSJESVJFQ1RJT046IHJ0bDsgVEVYVC1JTkRFTlQ6IC0wLjI1aW47IE1BUkdJ Ti1SSUdIVDogNDYuMTVwdDsgVEVYVC1BTElHTjogcmlnaHQiPjxiPjxzcGFuIHN0eWxlPSJGT05U LVNJWkU6IDEwcHQ7IENPTE9SOiAjZmY2NjAwOyBGT05ULUZBTUlMWTogQXJpYWwiPjxzcGFuPijD nSk8c3BhbiBzdHlsZT0iRk9OVDogN3B0ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTsiPiZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L2I+ PHNwYW4gZGlyPSJydGwiPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBzdHlsZT0iRk9OVC1TSVpFOiAx MHB0OyBDT0xPUjogYmx1ZTsgRk9OVC1GQU1JTFk6IEFyaWFsIj7U3skg3cfO0ckg2uHsINTH0dog x+HM5uHdIMfh0cbt0+wgze3LIMfhyuPt0iDH4drH4ewgx+Hd7eYg2uHsIOPtz8fkIMfRx8jt4cc8 L3NwYW4+PC9iPjwvc3Bhbj48Yj48c3BhbiBkaXI9Imx0ciIgc3R5bGU9IkZPTlQtU0laRTogMTBw dDsgQ09MT1I6IGJsdWU7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PC9zcGFuPjwvYj48L3A+Cgo8cCBk aXI9InJ0bCIgc3R5bGU9IkRJUkVDVElPTjogcnRsOyBNQVJHSU4tUklHSFQ6IDI4LjE1cHQ7IFRF WFQtQUxJR046IHJpZ2h0Ij48Yj48c3BhbiBsYW5nPSJBUi1FRyIgc3R5bGU9IkZPTlQtU0laRTog MTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj7j08fNySAyMDDjINrIx9HlINrkIDPk5uMg5jPR08jU 5CDmMs3jx+Mg5uPYyM4g5sjh3+bkIOYyyOHf5uQgytTY7cg8c3Bhbj4mbmJzcDsgPC9zcGFuPt3H ztHH4dPa0SDH4ePY4ebIIDIwMDDM5O3lIOPV0ewgPC9zcGFuPjwvYj48L3A+Cgo8cCBkaXI9InJ0 bCIgc3R5bGU9IkRJUkVDVElPTjogcnRsOyBURVhULUlOREVOVDogLTAuMjVpbjsgTUFSR0lOLVJJ R0hUOiA0Ni4xNXB0OyBURVhULUFMSUdOOiByaWdodCI+PGI+PHNwYW4gc3R5bGU9IkZPTlQtU0la RTogMTBwdDsgQ09MT1I6ICNmZjY2MDA7IEZPTlQtRkFNSUxZOiBBcmlhbCI+PHNwYW4+KMidKTxz cGFuIHN0eWxlPSJGT05UOiA3cHQgJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OyI+Jm5ic3A7Jm5i c3A7Jm5ic3A7IDwvc3Bhbj48L3NwYW4+PC9zcGFuPjwvYj48c3BhbiBkaXI9InJ0bCI+PGI+PHNw YW4gbGFuZz0iQVItRUciIHN0eWxlPSJDT0xPUjogYmx1ZTsgRk9OVC1GQU1JTFk6IEFyaWFsIj7U 3skgMTUw4yDIx+HKzOPaIMfhzsfj0yDIx+HN7CDH4cvH4csgyMzmx9Eg49PMzyDdx9jjySDH4dTR yMrh7Dwvc3Bhbj48L2I+PC9zcGFuPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBzdHlsZT0iRk9OVC1T SVpFOiAxMHB0OyBGT05ULUZBTUlMWTogQXJpYWwiPiDj08fNySAxNTDjINrIx9HlINrkIDPk5uMg 5jPR08jU5CDmMs3jx+Mg5iDj2MjOIObI4d/m5CDK1NjtyCDdx87RINrh7CDmx8zl5SDIzdHsIObN z+3eySDm2uHsINTH0dog2tHW5TUw4yDm2+3RIOPM0ebNySDk5cfG7CDH4dPa0SDH4ePY4ebIIDI1 MDDM5O3lIOPV0ewgPC9zcGFuPjwvYj48Yj48c3BhbiBkaXI9Imx0ciIgc3R5bGU9IkZPTlQtU0la RTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj48L3NwYW4+PC9iPjwvcD4KCjxwIGRpcj0icnRs IiBzdHlsZT0iRElSRUNUSU9OOiBydGw7IE1BUkdJTi1SSUdIVDogMjguMTVwdDsgVEVYVC1BTElH TjogcmlnaHQiPjxzcGFuIGRpcj0icnRsIj48L3NwYW4+PGI+PHNwYW4gbGFuZz0iQVItRUciIHN0 eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiAjZmY2NjAwOyBGT05ULUZBTUlMWTogQXJpYWwi PjxzcGFuIGRpcj0icnRsIj48L3NwYW4+KMwpPC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1F RyIgc3R5bGU9IkNPTE9SOiBibHVlOyBGT05ULUZBTUlMWTogQXJpYWwiPuHRx9vI7CDH4dPf5CDH 4d3HztEg1N7JIMfR1uwgyM3P7d7JIM7h3SDd5M/eIMfh4+3Rx8wgyMfhyszj2jwvc3Bhbj48L2I+ PGI+PHNwYW4gbGFuZz0iQVItRUciIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZ OiBBcmlhbCI+INTeySDex+Tm5CDMz+3PIMjH4d7H5dHJIMfhzM/tz8kgx9HW7CDj0crd2iDIzc/t 3skgzsfVySDj08fNySAzMDDjINrIx9HlINrkIDTb0d0g5jPR08jU5CDmMs3jx+Mg5uPYyM4g5srU 2O3IINPt0cfj7d8g3cfO0SDmyOXHIMrh7d3m5CDH4dPa0SDH4ePY4ebIIDM1MDDM5O3lIOPV0ewg PC9zcGFuPjwvYj48L3A+Cgo8cCBkaXI9InJ0bCIgc3R5bGU9IkRJUkVDVElPTjogcnRsOyBNQVJH SU4tUklHSFQ6IDI4LjE1cHQ7IFRFWFQtQUxJR046IHJpZ2h0Ij48Yj48c3BhbiBsYW5nPSJBUi1F RyIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICNmZjY2MDA7IEZPTlQtRkFNSUxZOiBB cmlhbCI+KM8pPC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1FRyIgc3R5bGU9IkZPTlQtU0la RTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj4gPC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJB Ui1FRyIgc3R5bGU9IkNPTE9SOiBibHVlOyBGT05ULUZBTUlMWTogQXJpYWwiPt3t4ccgz+bI4d/T INHHxtrJIMjNz+3eySDOx9XJIMjH4crM49ogx+HOx+PTIOHhx+3Mx9Eg3sfk5uQgzM/tzzwvc3Bh bj48L2I+PGI+PHNwYW4gbGFuZz0iQVItRUciIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQt RkFNSUxZOiBBcmlhbCI+IN3t4ccg0ebaySDH0dbsIOPTx83JIDI1MOMg2sjH0eUg2uQgM+Tm4yDm M9HTyNTkIOYzzePH4yDm49jIziDmyOHf5uQgytTY7cgg0c7H4yDm0+3Rx+Pt3yDmyOXHIMfh5uPt ysfhIMfh09rRIMfh49jh5sggNDAwMMzk7eUg49XR7CA8L3NwYW4+PC9iPjwvcD4KCjxwIGRpcj0i cnRsIiBzdHlsZT0iRElSRUNUSU9OOiBydGw7IE1BUkdJTi1SSUdIVDogMjguMTVwdDsgVEVYVC1B TElHTjogcmlnaHQiPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0 OyBDT0xPUjogI2ZmNjYwMDsgRk9OVC1GQU1JTFk6IEFyaWFsIj4o5Sk8L3NwYW4+PC9iPjxiPjxz cGFuIGxhbmc9IkFSLUVHIiBzdHlsZT0iQ09MT1I6IGJsdWU7IEZPTlQtRkFNSUxZOiBBcmlhbCI+ 3e3hxyDj08re4ckgMzUw4yDIx+HV5tEg5MfV7ckg2uHsINTH0dogx+HK09rt5CDH4dHG7dPsIMjH 4crM49ogx+HOx+PTPC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1FRyIgc3R5bGU9IkZPTlQt U0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IEFyaWFsIj4g3e3hxyDI4+be2iDh5CDtyt/R0SDex+Tm 5CDMz+3PINrh7CDkx9XtySDUx9Ha7eQg0cbt0+3t5CDIx+HKzOPaIMfhzsfj0yDjx9LH4cogys3K IMfhytTY7cgg2sjH0eUg2uQgNOTm4yDmNNHTyNTkIOYzzePH4yDm49jIziDmMsjh3+bkIDwvc3Bh bj48L2I+PC9wPgoKPHAgZGlyPSJydGwiIHN0eWxlPSJESVJFQ1RJT046IHJ0bDsgTUFSR0lOLVJJ R0hUOiAyOC4xNXB0OyBURVhULUFMSUdOOiByaWdodCI+PGI+PHNwYW4gbGFuZz0iQVItRUciIHN0 eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiAjZmY2NjAwOyBGT05ULUZBTUlMWTogQXJpYWwi PijmKTwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItRUciIHN0eWxlPSJGT05ULVNJWkU6IDEw cHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+IDwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItRUci IHN0eWxlPSJDT0xPUjogYmx1ZTsgRk9OVC1GQU1JTFk6IEFyaWFsIj7d7eHHIOPTyt7hySDH48fj IOPPx9HTIMfO5MfK5uQgyMfhyszj2iDH4c7H49Mg4eHH7czH0SDex+Tm5CDMz+08L3NwYW4+PC9i PjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlM WTogQXJpYWwiPs8g4+be2uXHIOPU5eYg0czPxyDj5CDH0d7sIOPmx97aIMjH4crM49ogx+HOx+PT IOPTx83K5ccgNjAw4yDayMfR5SDa5CDIz9Hm4yDmx9HW7CDmx+bhIObR5ubdPC9zcGFuPjwvYj48 L3A+Cgo8cCBkaXI9InJ0bCIgc3R5bGU9IkRJUkVDVElPTjogcnRsOyBNQVJHSU4tUklHSFQ6IDI4 LjE1cHQ7IFRFWFQtQUxJR046IHJpZ2h0Ij48Yj48c3BhbiBsYW5nPSJBUi1FRyIgc3R5bGU9IkZP TlQtU0laRTogMTBwdDsgQ09MT1I6ICNmZjY2MDA7IEZPTlQtRkFNSUxZOiBBcmlhbCI+x+Ha0dYx Njo8L3NwYW4+PC9iPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0 OyBGT05ULUZBTUlMWTogQXJpYWwiPjxzcGFuPiZuYnNwOyA8L3NwYW4+PC9zcGFuPjwvYj48Yj48 c3BhbiBsYW5nPSJBUi1FRyIgc3R5bGU9IkNPTE9SOiBibHVlOyBGT05ULUZBTUlMWTogQXJpYWwi PtTeySAxMTDjIN7H5ObkIMzP7c8gyMfh497Y4zwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVIt RUciIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+IDwvc3Bhbj48 L2I+PC9wPgoKPHAgZGlyPSJydGwiIHN0eWxlPSJESVJFQ1RJT046IHJ0bDsgTUFSR0lOLVJJR0hU OiAyOC4xNXB0OyBURVhULUFMSUdOOiByaWdodCI+PGI+PHNwYW4gbGFuZz0iQVItRUciIHN0eWxl PSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+4eHH7czH0SDex+Tm5CDMz+3P INTeySDIx+Hj3tjjIMjH4eXWyMkgx+Hm09jsIM/m0dPHz9Mg49PHzckgMTEw4yDayMfRySDa5CAy 5ObjIOYy0dPI1OQg5s3jx+Mg5uPYyM4g5sjh3+bkIMrU2O3IIN/H4+Eg5u3MzyDM0cfMIM7H1SDI 5ccgx+HT2tEgx+Hj2OHmyCAxMTAwzOTt5SDj1dHsIDwvc3Bhbj48L2I+PC9wPgoKPHAgZGlyPSJy dGwiIHN0eWxlPSJESVJFQ1RJT046IHJ0bDsgTUFSR0lOLVJJR0hUOiAyOC4xNXB0OyBURVhULUFM SUdOOiByaWdodCI+PGI+PHNwYW4gbGFuZz0iQVItRUciIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7 IENPTE9SOiAjZmY2NjAwOyBGT05ULUZBTUlMWTogQXJpYWwiPsfh2tHWMTc6PC9zcGFuPjwvYj48 Yj48c3BhbiBsYW5nPSJBUi1FRyIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6 IEFyaWFsIj48c3Bhbj4mbmJzcDsmbmJzcDsgPC9zcGFuPjwvc3Bhbj48L2I+PGI+PHNwYW4gbGFu Zz0iQVItRUciIHN0eWxlPSJDT0xPUjogYmx1ZTsgRk9OVC1GQU1JTFk6IEFyaWFsIj7d7eHHIMjj 0cjaIMfh5tLH0cEgyMfh1O3Rx8rm5CDIx+Tm0cfjxyDa4ewgzePH4yDTyMfNyTwvc3Bhbj48L2I+ PGI+PHNwYW4gbGFuZz0iQVItRUciIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZ OiBBcmlhbCI+IDwvc3Bhbj48L2I+PC9wPgoKPHAgZGlyPSJydGwiIHN0eWxlPSJESVJFQ1RJT046 IHJ0bDsgTUFSR0lOLVJJR0hUOiAyOC4xNXB0OyBURVhULUFMSUdOOiByaWdodCI+PGI+PHNwYW4g bGFuZz0iQVItRUciIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCI+ 4eHH7czH0SDex+Tm5CDMz+3PIN3t4ccgyMfhz+bRIMfh0cfI2iDI1MfR2iDj5sfS7CDh3e3hxyDj 5O3RIMvHyMogyMfh1O3Rx8rm5CDj08fNyTM1MOMg2sjH0eUg2uQgM+Tm4yDmNNHTyNTkIOYzzePH 4yDm49jIziDmyOHf5uQg5t/hINvR3ckg4eXHIM3jx+MgzsfVIMjlxyDmytTY7cjlxyDIx9Hf7eUg 5tPt0cfj7d8g5sjlxyDj2MjOIMfR5iDmz+3f5tHHyiDa4ewgx9rh7CDj08rm7CDmx+HT3+Qg0cfe 7CDl0Mcgx+Hj5t7aIOHQ5uwgx+HdzsfjySDH4dPa0SDH4ePY4ebIIDkwMDDM5O3lIOPV0ewgPC9z cGFuPjwvYj48L3A+CjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBkaXI9InJ0bCIgc3R5bGU9IkZPTlQt U0laRTogMTBwdCI+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj4KPHAgc3R5bGU9Ik1BUkdJ TjogMGluIDBpbiAwcHQiPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9IkZP TlQtU0laRTogMTBwdDsgQ09MT1I6IHJlZCI+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj7l 5Mcg483hx8ogyNTmx9HaIMrMx9HtySDj5CDH4c/RzMkgx+HH5uHsPHNwYW4+Jm5ic3A7IDwvc3Bh bj7m4+bH3tog5MfP0ckg4czj7dogx+HH29HH1iDh4cjt2iDH5iDH4cftzMfRIMjj08fNx8og5sfj x9/kIOPK3dHeySDI49XRIOPk5ccgyMfh1ebRPC9mb250Pjwvc3Bhbj48L2I+PC9wPgoKPHAgc3R5 bGU9Ik1BUkdJTjogMGluIDBpbiAwcHQiPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIg c3R5bGU9IkZPTlQtU0laRTogMTBwdCI+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj4mbmJz cDs8L2ZvbnQ+PC9zcGFuPjwvYj48L3A+CjxwIHN0eWxlPSJNQVJHSU46IDBpbiAwaW4gMHB0Ij48 Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0 bCIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6IGJsdWUiPsfh2tHWMTo8L3NwYW4+PC9i PjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9IkZPTlQtU0laRTogMTBwdCI+ PHNwYW4+Jm5ic3A7IDwvc3Bhbj48c3BhbiBzdHlsZT0iQ09MT1I6IGZ1Y2hzaWEiPuPN4SDh4cjt 2iDH5iDH4cftzMfRIN3sIOPV0SDH4czP7c/JIMjj5t7aIOTHz9Hm4d7YySDI4+3Px+Qgx+HH0+PH 2u3h7ck8L3NwYW4+INrh7CDUx9HaINHG7dPsIO3V4c0g4cjk5t8gLSDK5t/t4cfKIMfN0O3JLSDK 5t/t4cfKIOPYx9rjLSDK5t/t4cfKIOPN4+bhIOPTx83JIDcw4yDIx9HK3cfaIDQuNSDjytEg5uPT ysjazyDk1MfYINXtz+HtySDH4crax97PIN3sIM3H4ckgx+HH7czH0SDj2OHmyCA21OXm0SDj3s/j IObH4ePP5SDH4cftzMfR7ck10+Tmx8og5sfhx+3Mx9Egx+Hj2OHmyCAyMsfh3SDM5O3lIOPV0ewg PC9zcGFuPjwvYj48L2ZvbnQ+PC9wPgoKPGRpdiBzdHlsZT0iQk9SREVSLVJJR0hUOiBtZWRpdW0g bm9uZTsgUEFERElORy1SSUdIVDogMGluOyBCT1JERVItVE9QOiBtZWRpdW0gbm9uZTsgUEFERElO Ry1MRUZUOiAwaW47IFBBRERJTkctQk9UVE9NOiAxcHQ7IEJPUkRFUi1MRUZUOiBtZWRpdW0gbm9u ZTsgUEFERElORy1UT1A6IDBpbjsgQk9SREVSLUJPVFRPTTogd2luZG93dGV4dCAxLjVwdCBzb2xp ZCI+CjxwIHN0eWxlPSJCT1JERVItUklHSFQ6IG1lZGl1bSBub25lOyBQQURESU5HLVJJR0hUOiAw aW47IEJPUkRFUi1UT1A6IG1lZGl1bSBub25lOyBQQURESU5HLUxFRlQ6IDBpbjsgUEFERElORy1C T1RUT006IDBpbjsgTUFSR0lOOiAwaW4gMGluIDBwdDsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25l OyBQQURESU5HLVRPUDogMGluOyBCT1JERVItQk9UVE9NOiBtZWRpdW0gbm9uZSI+PGI+PHNwYW4g bGFuZz0iQVItRUciIGRpcj0icnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0Ij48Zm9udCBmYWNl PSJUaW1lcyBOZXcgUm9tYW4iPubd7CDNx+HJIMfhyO3aIMfh48rRINrh7CAyOMfh3SDM5O3lIOPV 0ew8c3Bhbj4mbmJzcDsgPC9zcGFuPsfsIMfhx8zjx+HsIDE5NjAwMDDH4d0gzOTt5SDj1dHsIDwv Zm9udD48L3NwYW4+PC9iPjwvcD4KPC9kaXY+CjxwIHN0eWxlPSJNQVJHSU46IDBpbiAwaW4gMHB0 Ij48Yj48c3BhbiBsYW5nPSJBUi1FRyIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQi Pjxmb250IGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+Jm5ic3A7PC9mb250Pjwvc3Bhbj48L2I+PC9w Pgo8cCBzdHlsZT0iTUFSR0lOOiAwaW4gMGluIDBwdCI+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJv bWFuIj48Yj48c3BhbiBsYW5nPSJBUi1FRyIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJWkU6IDEw cHQ7IENPTE9SOiBibHVlIj7H4drR1jI6PC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1FRyIg ZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQiPjxzcGFuPiZuYnNwOyZuYnNwOyA8L3Nw YW4+PHNwYW4gc3R5bGU9IkNPTE9SOiBmdWNoc2lhIj7jzeHt5CDd0dXJIOHe2MkgyNrt5CDU49Mg yMfI0cfl7eMg2sjPIMfh0cfS3iDH4dHG7dPsIM3tyyDH4d/Lx93JIMfh09/H5O3JIMfh2sfh7ckg PC9zcGFuPubU5dHK5SDH4crMx9HtySDj5CDH4c/RzMkgx+HH5uHsPHNwYW4+Jm5ic3A7IDwvc3Bh bj7h4cjt2iDH5iDH4cftzMfRIOPTx83JIMfhx+bhIDYw4yDmx+HLx+TsIDkw4yDm5eTH3yDH49/H 5O3lIN3KzeXjINrh7CDI2tYg2uHsIMfh2ObIIMfhx83j0SDa0dYgx+HUx9HaIDIw4yDI5eMgzOPt 2iDH4ePRx93eIMrRzu3VIMfh483hx8ogyszH0ewg4+Qgx+HN7CDm7ebMzyDM4+3aIMfh4+bH1eHH yiDm7ebMzyDK0+Xt4cfKIN3sIMfh08/Hzzwvc3Bhbj48L2I+PC9mb250PjwvcD4KCjxkaXYgc3R5 bGU9IkJPUkRFUi1SSUdIVDogbWVkaXVtIG5vbmU7IFBBRERJTkctUklHSFQ6IDBpbjsgQk9SREVS LVRPUDogbWVkaXVtIG5vbmU7IFBBRERJTkctTEVGVDogMGluOyBQQURESU5HLUJPVFRPTTogMXB0 OyBCT1JERVItTEVGVDogbWVkaXVtIG5vbmU7IFBBRERJTkctVE9QOiAwaW47IEJPUkRFUi1CT1RU T006IHdpbmRvd3RleHQgMS41cHQgc29saWQiPgo8cCBzdHlsZT0iQk9SREVSLVJJR0hUOiBtZWRp dW0gbm9uZTsgUEFERElORy1SSUdIVDogMGluOyBCT1JERVItVE9QOiBtZWRpdW0gbm9uZTsgUEFE RElORy1MRUZUOiAwaW47IFBBRERJTkctQk9UVE9NOiAwaW47IE1BUkdJTjogMGluIDBpbiAwcHQ7 IEJPUkRFUi1MRUZUOiBtZWRpdW0gbm9uZTsgUEFERElORy1UT1A6IDBpbjsgQk9SREVSLUJPVFRP TTogbWVkaXVtIG5vbmUiPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9IkZP TlQtU0laRTogMTBwdCI+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj4mbmJzcDs8L2ZvbnQ+ PC9zcGFuPjwvYj48L3A+CjwvZGl2Pgo8cCBzdHlsZT0iTUFSR0lOOiAwaW4gMGluIDBwdCI+PGI+ PHNwYW4gbGFuZz0iQVItRUciIGRpcj0icnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0Ij48Zm9u dCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPiZuYnNwOzwvZm9udD48L3NwYW4+PC9iPjwvcD4KPHAg c3R5bGU9Ik1BUkdJTjogMGluIDBpbiAwcHQiPjxmb250IGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+ PGI+PHNwYW4gbGFuZz0iQVItRUciIGRpcj0icnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBD T0xPUjogYmx1ZSI+x+Ha0dYzOjwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItRUciIGRpcj0i cnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0Ij48c3Bhbj4mbmJzcDsmbmJzcDsgPC9zcGFuPjxz cGFuIHN0eWxlPSJDT0xPUjogZnVjaHNpYSI+0+bI0SDjx9HfyiAxNzDjIMjH4ePR7ebY7ckg2uHs INTH0drt5CDm5eYg1NvH4SDNx+HtxyA8L3NwYW4+PC9zcGFuPjwvYj48L2ZvbnQ+PC9wPgoKPGRp diBzdHlsZT0iQk9SREVSLVJJR0hUOiBtZWRpdW0gbm9uZTsgUEFERElORy1SSUdIVDogMGluOyBC T1JERVItVE9QOiBtZWRpdW0gbm9uZTsgUEFERElORy1MRUZUOiAwaW47IFBBRERJTkctQk9UVE9N OiAxcHQ7IEJPUkRFUi1MRUZUOiBtZWRpdW0gbm9uZTsgUEFERElORy1UT1A6IDBpbjsgQk9SREVS LUJPVFRPTTogd2luZG93dGV4dCAxLjVwdCBzb2xpZCI+CjxwIHN0eWxlPSJCT1JERVItUklHSFQ6 IG1lZGl1bSBub25lOyBQQURESU5HLVJJR0hUOiAwaW47IEJPUkRFUi1UT1A6IG1lZGl1bSBub25l OyBQQURESU5HLUxFRlQ6IDBpbjsgUEFERElORy1CT1RUT006IDBpbjsgTUFSR0lOOiAwaW4gMGlu IDBwdDsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25lOyBQQURESU5HLVRPUDogMGluOyBCT1JERVIt Qk9UVE9NOiBtZWRpdW0gbm9uZSI+PGI+PHNwYW4gbGFuZz0iQVItRUciIGRpcj0icnRsIiBzdHls ZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogZnVjaHNpYSI+PGZvbnQgZmFjZT0iVGltZXMgTmV3 IFJvbWFuIj4mbmJzcDs8L2ZvbnQ+PC9zcGFuPjwvYj48L3A+CjwvZGl2Pgo8cCBzdHlsZT0iTUFS R0lOOiAwaW4gMGluIDBwdCI+PGI+PHNwYW4gbGFuZz0iQVItRUciIGRpcj0icnRsIiBzdHlsZT0i Rk9OVC1TSVpFOiAxMHB0Ij48Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPiZuYnNwOzwvZm9u dD48L3NwYW4+PC9iPjwvcD4KPHAgc3R5bGU9Ik1BUkdJTjogMGluIDBpbiAwcHQiPjxmb250IGZh Y2U9IlRpbWVzIE5ldyBSb21hbiI+PGI+PHNwYW4gbGFuZz0iQVItRUciIGRpcj0icnRsIiBzdHls ZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogYmx1ZSI+x+Ha0dY0Ojwvc3Bhbj48L2I+PGI+PHNw YW4gbGFuZz0iQVItRUciIGRpcj0icnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0Ij48c3Bhbj4m bmJzcDsmbmJzcDsgPC9zcGFuPjxzcGFuIHN0eWxlPSJDT0xPUjogZnVjaHNpYSI+483hx8ogyOPm x97aIOHe2MkgyOPV0SDH4d7P7ePJIOPm3togyszH0ewg0cfG2iDIzObH0SDjzdjJIOPK0eYg48fR 7CDM0czTIObIzObH0SDH4d/m0eTt1CDm3tPjIOPV0SDH4d7P7ePJIOHhyO3aIMfmIOHhx+3Mx9E8 L3NwYW4+PC9zcGFuPjwvYj48L2ZvbnQ+PC9wPgoKPHAgc3R5bGU9Ik1BUkdJTjogMGluIDBpbiAw cHQiPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9IkZPTlQtU0laRTogMTBw dCI+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj4xXyDjzeEg49PHzcrlIDYw4yDK1NjtyCDT 5sjRIOHm39Mgx9HW7cfKIObN5sfG2CDT7dHH4+3fIObV4cfKIObf1Mfdx8ogPC9mb250Pjwvc3Bh bj48L2I+PC9wPgo8cCBzdHlsZT0iTUFSR0lOOiAwaW4gMGluIDBwdCI+PGI+PHNwYW4gbGFuZz0i QVItRUciIGRpcj0icnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0Ij48Zm9udCBmYWNlPSJUaW1l cyBOZXcgUm9tYW4iPjJfIO3mzM8gx+3WxyDjzeHHyiDj5CAxNcfh7CAxMjDjIMjP5uQgytTY7cgg x+3WxyDI5N3TIMfh4+be2iDH4crMx9HsIOXQxyA8L2ZvbnQ+PC9zcGFuPjwvYj48L3A+CjxkaXYg c3R5bGU9IkJPUkRFUi1SSUdIVDogbWVkaXVtIG5vbmU7IFBBRERJTkctUklHSFQ6IDBpbjsgQk9S REVSLVRPUDogbWVkaXVtIG5vbmU7IFBBRERJTkctTEVGVDogMGluOyBQQURESU5HLUJPVFRPTTog MXB0OyBCT1JERVItTEVGVDogbWVkaXVtIG5vbmU7IFBBRERJTkctVE9QOiAwaW47IEJPUkRFUi1C T1RUT006IHdpbmRvd3RleHQgMS41cHQgc29saWQiPgo8cCBzdHlsZT0iQk9SREVSLVJJR0hUOiBt ZWRpdW0gbm9uZTsgUEFERElORy1SSUdIVDogMGluOyBCT1JERVItVE9QOiBtZWRpdW0gbm9uZTsg UEFERElORy1MRUZUOiAwaW47IFBBRERJTkctQk9UVE9NOiAwaW47IE1BUkdJTjogMGluIDBpbiAw cHQ7IEJPUkRFUi1MRUZUOiBtZWRpdW0gbm9uZTsgUEFERElORy1UT1A6IDBpbjsgQk9SREVSLUJP VFRPTTogbWVkaXVtIG5vbmUiPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9 IkZPTlQtU0laRTogMTBwdCI+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj4zXyDIz9Hm4yAz MDDjIMfR1u3HyiDN1e3RySDO0dPH5O3JIObN5sfG2CDK5ebtySDj5CA05szlx8og3uPt1SDO0dPH 5Owg7dXhzSDjztLkIMfmIOPV5NogPC9mb250Pjwvc3Bhbj48L2I+PC9wPgoKPHAgc3R5bGU9IkJP UkRFUi1SSUdIVDogbWVkaXVtIG5vbmU7IFBBRERJTkctUklHSFQ6IDBpbjsgQk9SREVSLVRPUDog bWVkaXVtIG5vbmU7IFBBRERJTkctTEVGVDogMGluOyBQQURESU5HLUJPVFRPTTogMGluOyBNQVJH SU46IDBpbiAwaW4gMHB0OyBCT1JERVItTEVGVDogbWVkaXVtIG5vbmU7IFBBRERJTkctVE9QOiAw aW47IEJPUkRFUi1CT1RUT006IG1lZGl1bSBub25lIj48Yj48c3BhbiBsYW5nPSJBUi1FRyIgZGly PSJydGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQiPjxmb250IGZhY2U9IlRpbWVzIE5ldyBSb21h biI+Jm5ic3A7PC9mb250Pjwvc3Bhbj48L2I+PC9wPgo8L2Rpdj4KPHAgc3R5bGU9Ik1BUkdJTjog MGluIDBpbiAwcHQiPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9IkZPTlQt U0laRTogMTBwdCI+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj4mbmJzcDs8L2ZvbnQ+PC9z cGFuPjwvYj48L3A+CjxwIHN0eWxlPSJNQVJHSU46IDBpbiAwaW4gMHB0Ij48Yj48c3BhbiBsYW5n PSJBUi1FRyIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQiPjxmb250IGZhY2U9IlRp bWVzIE5ldyBSb21hbiI+PHNwYW4+Jm5ic3A7IDwvc3Bhbj48c3BhbiBzdHlsZT0iQ09MT1I6IGJs dWUiPjxzcGFuPiZuYnNwOzwvc3Bhbj7H4drR1jU6PC9zcGFuPjxzcGFuPiZuYnNwOyZuYnNwOyA8 L3NwYW4+PHNwYW4gc3R5bGU9IkNPTE9SOiBmdWNoc2lhIj7jzeEgyNPkytEgx+Hjz+3kyTxzcGFu PiZuYnNwOyA8L3NwYW4+yMfh49Hf0iDH4drH4ePsPHNwYW4+Jm5ic3A7IDwvc3Bhbj7j5t7aIOPK 4+3SIMjH4drH1NEg4+Qg0ePWx+QgyMzmx9Egx+Hj5t7dIDwvc3Bhbj7mx+HI5ObfIMjj2uTsIMfk 5TxzcGFuPiZuYnNwOyA8L3NwYW4+4+be2iDKzMfR7CDm5eYgyMfhz+bRIMfhysfhyiDmx+3WxyDI zObH0SDH4dPh4yDmx+HH08fk0+3RINnH5dEgzM/HIOPTx83K5SAzMdI14yDOx+HVIMfhy+PkIObI 483W0SDH4cfTyuHH4yDm2t7PIOTlx8bsINvt0SDjzc/PIMfh5NTH2CDH4cjHyCDNz+3PIObH4dTI x8jt3yDI2tHWIMfh483hIMjH4cfh5uPtysfhIObjz+Xm5CDI4cfTyu3fIMfI7dYgPC9mb250Pjwv c3Bhbj48L2I+PC9wPgoKPGRpdiBzdHlsZT0iQk9SREVSLVJJR0hUOiBtZWRpdW0gbm9uZTsgUEFE RElORy1SSUdIVDogMGluOyBCT1JERVItVE9QOiBtZWRpdW0gbm9uZTsgUEFERElORy1MRUZUOiAw aW47IFBBRERJTkctQk9UVE9NOiAxcHQ7IEJPUkRFUi1MRUZUOiBtZWRpdW0gbm9uZTsgUEFERElO Ry1UT1A6IDBpbjsgQk9SREVSLUJPVFRPTTogd2luZG93dGV4dCAxLjVwdCBzb2xpZCI+CjxwIHN0 eWxlPSJCT1JERVItUklHSFQ6IG1lZGl1bSBub25lOyBQQURESU5HLVJJR0hUOiAwaW47IEJPUkRF Ui1UT1A6IG1lZGl1bSBub25lOyBQQURESU5HLUxFRlQ6IDBpbjsgUEFERElORy1CT1RUT006IDBp bjsgTUFSR0lOOiAwaW4gMGluIDBwdDsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25lOyBQQURESU5H LVRPUDogMGluOyBCT1JERVItQk9UVE9NOiBtZWRpdW0gbm9uZSI+PGI+PHNwYW4gbGFuZz0iQVIt RUciIGRpcj0icnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0Ij48Zm9udCBmYWNlPSJUaW1lcyBO ZXcgUm9tYW4iPsfjxyDH4dPa0SDd5eYg4d7YySA1MMfh3SDM5O3lIOPV0ewgPC9mb250Pjwvc3Bh bj48L2I+PC9wPgo8L2Rpdj4KPHAgc3R5bGU9Ik1BUkdJTjogMGluIDBpbiAwcHQiPjxiPjxzcGFu IGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9IkZPTlQtU0laRTogMTBwdCI+PGZvbnQgZmFj ZT0iVGltZXMgTmV3IFJvbWFuIj4mbmJzcDs8L2ZvbnQ+PC9zcGFuPjwvYj48L3A+CjxwIHN0eWxl PSJNQVJHSU46IDBpbiAwaW4gMHB0Ij48Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPjxiPjxz cGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6 IGJsdWUiPsfh2tHWNjo8L3NwYW4+PC9iPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIg c3R5bGU9IkZPTlQtU0laRTogMTBwdCI+PHNwYW4+Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48c3BhbiBz dHlsZT0iQ09MT1I6IGZ1Y2hzaWEiPuPN4SDI4+be2iDH08rL48fR7CDh4cjt2iDIx+HayOYg0SDO 4d0gx8jmINDf0ewgyNPkytEgx9PKy+PH0ewg4+Qgx+HP0czJIMfhx+bh7CA8L3NwYW4+PC9zcGFu PjwvYj48L2ZvbnQ+PC9wPgoKPHAgc3R5bGU9Ik1BUkdJTjogMGluIDBpbiAwcHQiPjxiPjxzcGFu IGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9IkZPTlQtU0laRTogMTBwdCI+PGZvbnQgZmFj ZT0iVGltZXMgTmV3IFJvbWFuIj48c3Bhbj4mbmJzcDs8L3NwYW4+497HyOEg49Xhzckgx+HQ5cgg x+HMz+3PySDIx+HN7CDH4cfm4SDIx+HP5tEgx+HH0dbsIObHzOXlIDwvZm9udD48L3NwYW4+PC9i PjwvcD4KPGRpdiBzdHlsZT0iQk9SREVSLVJJR0hUOiBtZWRpdW0gbm9uZTsgUEFERElORy1SSUdI VDogMGluOyBCT1JERVItVE9QOiBtZWRpdW0gbm9uZTsgUEFERElORy1MRUZUOiAwaW47IFBBRERJ TkctQk9UVE9NOiAxcHQ7IEJPUkRFUi1MRUZUOiBtZWRpdW0gbm9uZTsgUEFERElORy1UT1A6IDBp bjsgQk9SREVSLUJPVFRPTTogd2luZG93dGV4dCAxLjVwdCBzb2xpZCI+CjxwIHN0eWxlPSJCT1JE RVItUklHSFQ6IG1lZGl1bSBub25lOyBQQURESU5HLVJJR0hUOiAwaW47IEJPUkRFUi1UT1A6IG1l ZGl1bSBub25lOyBQQURESU5HLUxFRlQ6IDBpbjsgUEFERElORy1CT1RUT006IDBpbjsgTUFSR0lO OiAwaW4gMGluIDBwdDsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25lOyBQQURESU5HLVRPUDogMGlu OyBCT1JERVItQk9UVE9NOiBtZWRpdW0gbm9uZSI+PGI+PHNwYW4gbGFuZz0iQVItRUciIGRpcj0i cnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0Ij48Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4i Psfh09rRIMfh49jh5sggMTYwx+HdIMzk7eUg49XR7CDfx9Qg5uPj3+QgytPl7eHHyjxzcGFuPiZu YnNwOyA8L3NwYW4+yNPa0SAxODDH4d0gzOTt5SDj1dHsIDwvZm9udD48L3NwYW4+PC9iPjwvcD4K CjxwIHN0eWxlPSJCT1JERVItUklHSFQ6IG1lZGl1bSBub25lOyBQQURESU5HLVJJR0hUOiAwaW47 IEJPUkRFUi1UT1A6IG1lZGl1bSBub25lOyBQQURESU5HLUxFRlQ6IDBpbjsgUEFERElORy1CT1RU T006IDBpbjsgTUFSR0lOOiAwaW4gMGluIDBwdDsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25lOyBQ QURESU5HLVRPUDogMGluOyBCT1JERVItQk9UVE9NOiBtZWRpdW0gbm9uZSI+PGI+PHNwYW4gbGFu Zz0iQVItRUciIGRpcj0icnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0Ij48Zm9udCBmYWNlPSJU aW1lcyBOZXcgUm9tYW4iPiZuYnNwOzwvZm9udD48L3NwYW4+PC9iPjwvcD4KPC9kaXY+CjxwIHN0 eWxlPSJNQVJHSU46IDBpbiAwaW4gMHB0Ij48Yj48c3BhbiBsYW5nPSJBUi1FRyIgZGlyPSJydGwi IHN0eWxlPSJGT05ULVNJWkU6IDEwcHQiPjxmb250IGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+Jm5i c3A7PC9mb250Pjwvc3Bhbj48L2I+PC9wPgo8cCBzdHlsZT0iTUFSR0lOOiAwaW4gMGluIDBwdCI+ PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj48Yj48c3BhbiBsYW5nPSJBUi1FRyIgZGlyPSJy dGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiBibHVlIj7H4drR1jc6PC9zcGFuPjwv Yj48Yj48c3BhbiBsYW5nPSJBUi1FRyIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQi PjxzcGFuPiZuYnNwOyZuYnNwOyA8L3NwYW4+PHNwYW4gc3R5bGU9IkNPTE9SOiBmdWNoc2lhIj7j zeEgMTIw4yDKzMfR7CDMz8fHx8fHx8cg2uHsINTH0dog0cbt0+w8c3Bhbj4mbmJzcDsgPC9zcGFu Psjj5t7aINHH3uwgzM/HIMjH4eHH09/kz9HtySA8L3NwYW4+PC9zcGFuPjwvYj48L2ZvbnQ+PC9w PgoKPGRpdiBzdHlsZT0iQk9SREVSLVJJR0hUOiBtZWRpdW0gbm9uZTsgUEFERElORy1SSUdIVDog MGluOyBCT1JERVItVE9QOiBtZWRpdW0gbm9uZTsgUEFERElORy1MRUZUOiAwaW47IFBBRERJTkct Qk9UVE9NOiAxcHQ7IEJPUkRFUi1MRUZUOiBtZWRpdW0gbm9uZTsgUEFERElORy1UT1A6IDBpbjsg Qk9SREVSLUJPVFRPTTogd2luZG93dGV4dCAxLjVwdCBzb2xpZCI+CjxwIHN0eWxlPSJCT1JERVIt UklHSFQ6IG1lZGl1bSBub25lOyBQQURESU5HLVJJR0hUOiAwaW47IEJPUkRFUi1UT1A6IG1lZGl1 bSBub25lOyBQQURESU5HLUxFRlQ6IDBpbjsgUEFERElORy1CT1RUT006IDBpbjsgTUFSR0lOOiAw aW4gMGluIDBwdDsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25lOyBQQURESU5HLVRPUDogMGluOyBC T1JERVItQk9UVE9NOiBtZWRpdW0gbm9uZSI+PGI+PHNwYW4gbGFuZz0iQVItRUciIGRpcj0icnRs IiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0Ij48Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPiZu YnNwOzwvZm9udD48L3NwYW4+PC9iPjwvcD4KPC9kaXY+CjxwIHN0eWxlPSJNQVJHSU46IDBpbiAw aW4gMHB0Ij48Yj48c3BhbiBsYW5nPSJBUi1FRyIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJWkU6 IDEwcHQiPjxmb250IGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+Jm5ic3A7PC9mb250Pjwvc3Bhbj48 L2I+PC9wPgo8cCBzdHlsZT0iTUFSR0lOOiAwaW4gMGluIDBwdCI+PGZvbnQgZmFjZT0iVGltZXMg TmV3IFJvbWFuIj48Yj48c3BhbiBsYW5nPSJBUi1FRyIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJ WkU6IDEwcHQ7IENPTE9SOiBibHVlIj7H4drR1jg6PHNwYW4+Jm5ic3A7IDwvc3Bhbj48L3NwYW4+ PC9iPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9IkZPTlQtU0laRTogMTBw dCI+PHNwYW4+Jm5ic3A7Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJDT0xPUjogZnVjaHNpYSI+ 483hIMjH4dTtziDSx+3PIDIwMDAgx+PH4yDj5MrM2iDH4czm48fk5TxzcGFuPiZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+PC9zcGFuPjxzcGFuPiZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj48L3NwYW4+PC9iPjwvZm9udD48L3A+ Cgo8cCBzdHlsZT0iTUFSR0lOOiAwaW4gMGluIDBwdCI+PGI+PHNwYW4gbGFuZz0iQVItRUciIGRp cj0icnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0Ij48Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9t YW4iPuPTx83JIDQw4yDKztXt1SDO1sfRIObdx9/l5SDm4+Pf5CDK2+3RIMfh5NTH2CDN08ggx+Hj ysfNIOPkIN7I4SDH4czlx9IgPC9mb250Pjwvc3Bhbj48L2I+PC9wPgo8ZGl2IHN0eWxlPSJCT1JE RVItUklHSFQ6IG1lZGl1bSBub25lOyBQQURESU5HLVJJR0hUOiAwaW47IEJPUkRFUi1UT1A6IG1l ZGl1bSBub25lOyBQQURESU5HLUxFRlQ6IDBpbjsgUEFERElORy1CT1RUT006IDFwdDsgQk9SREVS LUxFRlQ6IG1lZGl1bSBub25lOyBQQURESU5HLVRPUDogMGluOyBCT1JERVItQk9UVE9NOiB3aW5k b3d0ZXh0IDEuNXB0IHNvbGlkIj4KPHAgc3R5bGU9IkJPUkRFUi1SSUdIVDogbWVkaXVtIG5vbmU7 IFBBRERJTkctUklHSFQ6IDBpbjsgQk9SREVSLVRPUDogbWVkaXVtIG5vbmU7IFBBRERJTkctTEVG VDogMGluOyBQQURESU5HLUJPVFRPTTogMGluOyBNQVJHSU46IDBpbiAwaW4gMHB0OyBCT1JERVIt TEVGVDogbWVkaXVtIG5vbmU7IFBBRERJTkctVE9QOiAwaW47IEJPUkRFUi1CT1RUT006IG1lZGl1 bSBub25lIj48Yj48c3BhbiBsYW5nPSJBUi1FRyIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJWkU6 IDEwcHQiPjxmb250IGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+x+Hjz93aIDc5x+HdIMzk7eUg49XR 7CDm49jh5sggNjLH4d0g0+Tm7ccg2uHsIDnH3tPH2CDH7CA50+Tmx8ogx+bhIN7T2CDt08rN3iDd 7CA0LzEyLzIwMDjmx+Hj2OHmyCA0MMfh3SDH5t3RIMjH4cfWx93JIMfh7CDH4ePI4dsgx+HQ7CDK 4yDP3drlIOPkIN7I4SDh4czlx9Ig5u3mzM8gx+Pfx+Tt5SDH4cre0+3YINrh7CAxMTje09ggx+wg MTjT5OUgyM/hxyDj5CA50+Tmx8ogPC9mb250Pjwvc3Bhbj48L2I+PC9wPgo8L2Rpdj4KPHAgc3R5 bGU9Ik1BUkdJTjogMGluIDBpbiAwcHQiPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIg c3R5bGU9IkZPTlQtU0laRTogMTBwdCI+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj4mbmJz cDs8L2ZvbnQ+PC9zcGFuPjwvYj48L3A+CjxwIHN0eWxlPSJNQVJHSU46IDBpbiAwaW4gMHB0Ij48 Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0 bCIgc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgQ09MT1I6IGJsdWUiPsfh2tHWIDk6PC9zcGFuPjwv Yj48Yj48c3BhbiBsYW5nPSJBUi1FRyIgZGlyPSJydGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7 IENPTE9SOiBmdWNoc2lhIj48c3Bhbj4mbmJzcDsmbmJzcDsgPC9zcGFuPuPe0SDj08fNyuUgMTgw MOMgyOPk2N7JIM3h5sfkIMfh0cbt0+3JIM3tyyDH4d/Lx93JIMfh09/H5O3JIMfh2sfh7ck8L3Nw YW4+PC9iPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9IkZPTlQtU0laRTog MTBwdCI+PC9zcGFuPjwvYj48L2ZvbnQ+PC9wPgoKPHAgc3R5bGU9Ik1BUkdJTjogMGluIDBpbiAw cHQiPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9IkZPTlQtU0laRTogMTBw dCI+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj7Ix+He0cgg4+Qg48rR5iDH4cfk3cfeIObj 5t7dIMfhx8rmyO3TIObH4dHT3e3TIObj5CDM4+3aIMfh2sfj4e3kIMjj1cfk2iDN4ebH5CDj49/k INrj4eXHIOPTytTd7CDH5iDj0d/SINjI7CDjyt/H4+EgyOTZx+Mgx+Hj1MfR38kg5uXkx98g4ccg 7ebMzyDj08rU3ewgx+Yg49Hf0iDYyOwgyOTd0yDH4ePTx83JIObt49/kINrj4SDV7c/h7ckgz8fO 4e3JIOHh49PK1N3sIOHOz+PJINHmx8/lxyDj3tPj5SDa4ewgz+bR7eQgx+bhPHNwYW4+Jm5ic3A7 IDwvc3Bhbj7mysfk7CDm3+Eg4+Tl4yA5MDDjIMjH4cfWx93lIOHhx9HW7CA0NTDjIOPaIMfj38fk 7eUg2uPhIOPPzuEgzsfVIDwvZm9udD48L3NwYW4+PC9iPjwvcD4KCjxkaXYgc3R5bGU9IkJPUkRF Ui1SSUdIVDogbWVkaXVtIG5vbmU7IFBBRERJTkctUklHSFQ6IDBpbjsgQk9SREVSLVRPUDogbWVk aXVtIG5vbmU7IFBBRERJTkctTEVGVDogMGluOyBQQURESU5HLUJPVFRPTTogMXB0OyBCT1JERVIt TEVGVDogbWVkaXVtIG5vbmU7IFBBRERJTkctVE9QOiAwaW47IEJPUkRFUi1CT1RUT006IHdpbmRv d3RleHQgMS41cHQgc29saWQiPgo8cCBzdHlsZT0iQk9SREVSLVJJR0hUOiBtZWRpdW0gbm9uZTsg UEFERElORy1SSUdIVDogMGluOyBCT1JERVItVE9QOiBtZWRpdW0gbm9uZTsgUEFERElORy1MRUZU OiAwaW47IFBBRERJTkctQk9UVE9NOiAwaW47IE1BUkdJTjogMGluIDBpbiAwcHQ7IEJPUkRFUi1M RUZUOiBtZWRpdW0gbm9uZTsgUEFERElORy1UT1A6IDBpbjsgQk9SREVSLUJPVFRPTTogbWVkaXVt IG5vbmUiPjxiPjxzcGFuIGxhbmc9IkFSLUVHIiBkaXI9InJ0bCIgc3R5bGU9IkZPTlQtU0laRTog MTBwdCI+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj7Y0e3eySDH4dPPx88g3ewgzcfh5SDH 4cjt2iDIx+HK3tPt2CDm3ewgzcfhIMfh49TH0d/JIO3f5uQg5M3kIMjH4ePfx+Qg5s3W0crf4yDI x+HKzOXt0sfKIObH4cfPx9HJIOPaIObM5s8g5NnH4yDjzcfTyOwg48rfx+PhIMfhx9HIx80g2Mje xyDh4eTTyCDH4crsIO3K4yDH4cfK3cfeINrh7eXHIDwvZm9udD48L3NwYW4+PC9iPjwvcD4KPC9k aXY+CjxwIHN0eWxlPSJNQVJHSU46IDBpbiAwaW4gMHB0Ij48Yj48c3BhbiBzdHlsZT0iRk9OVC1T SVpFOiAxMHB0Ij48Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPiZuYnNwOzwvZm9udD48L3Nw YW4+PC9iPjwvcD4KPHAgc3R5bGU9Ik1BUkdJTjogMGluIDBpbiAwcHQgMTg5cHQiPjxiPjxzcGFu IGxhbmc9IkFSLVNBIiBkaXI9InJ0bCIgc3R5bGU9IkZPTlQtU0laRTogMTBwdCI+PGZvbnQgZmFj ZT0iVGltZXMgTmV3IFJvbWFuIj7h4ePax+3k5SDt0czsIMfhx8rVx+Eg2uHsINHe4yDH4eXHyt0g x+Ygx+Hj0cfT4ckg2sjRIMfhx+3j7eE8L2ZvbnQ+PC9zcGFuPjwvYj48L3A+CjxkaXYgc3R5bGU9 Ik1BUkdJTjogMGluIDBpbiAwcHQgMTg5cHQiPjxiPjxzcGFuIGxhbmc9IkFSLVNBIiBkaXI9InJ0 bCIgc3R5bGU9IkZPTlQtU0laRTogMTBwdCI+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj4w MTAzMDQzNjgyPC9mb250Pjwvc3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItU0EiIGRpcj0icnRs IiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0Ij48Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPjwv Zm9udD48L3NwYW4+PC9iPjwvZGl2Pgo8L2ZvbnQ+PC9zcGFuPjwvYj4KPGRpdiBzdHlsZT0iQk9S REVSLVJJR0hUOiBtZWRpdW0gbm9uZTsgUEFERElORy1SSUdIVDogMGluOyBCT1JERVItVE9QOiBt ZWRpdW0gbm9uZTsgUEFERElORy1MRUZUOiAwaW47IFBBRERJTkctQk9UVE9NOiA2cHQ7IE1BUkdJ Ti1MRUZUOiAxODlwdDsgQk9SREVSLUxFRlQ6IG1lZGl1bSBub25lOyBNQVJHSU4tUklHSFQ6IDBp bjsgUEFERElORy1UT1A6IDBpbjsgQk9SREVSLUJPVFRPTTogd2luZG93dGV4dCAxLjVwdCBzb2xp ZCI+Cgo8cCBzdHlsZT0iQk9SREVSLVJJR0hUOiBtZWRpdW0gbm9uZTsgUEFERElORy1SSUdIVDog MGluOyBCT1JERVItVE9QOiBtZWRpdW0gbm9uZTsgUEFERElORy1MRUZUOiAwaW47IFBBRERJTkct Qk9UVE9NOiAwaW47IE1BUkdJTjogMGluIDBpbiAwcHQ7IEJPUkRFUi1MRUZUOiBtZWRpdW0gbm9u ZTsgUEFERElORy1UT1A6IDBpbjsgQk9SREVSLUJPVFRPTTogbWVkaXVtIG5vbmUiPjxiPjxzcGFu IHN0eWxlPSJGT05ULVNJWkU6IDEwcHQiPjxhIG9uY2xpY2s9InJldHVybiB0b3AuanMuT3BlbkV4 dExpbmsod2luZG93LGV2ZW50LHRoaXMpIiBocmVmPSJtYWlsdG86bWFza2FubWFzcnlAZ21haWwu Y29tIiB0YXJnZXQ9Il9ibGFuayI+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj5tYXNrYW5t YXNyeUBnbWFpbC5jb208L2ZvbnQ+PC9hPjwvc3Bhbj48L2I+PC9wPgoKPHAgc3R5bGU9IkJPUkRF Ui1SSUdIVDogbWVkaXVtIG5vbmU7IFBBRERJTkctUklHSFQ6IDBpbjsgQk9SREVSLVRPUDogbWVk aXVtIG5vbmU7IFBBRERJTkctTEVGVDogMGluOyBQQURESU5HLUJPVFRPTTogMGluOyBNQVJHSU46 IDBpbiAwaW4gMHB0OyBCT1JERVItTEVGVDogbWVkaXVtIG5vbmU7IFBBRERJTkctVE9QOiAwaW47 IEJPUkRFUi1CT1RUT006IG1lZGl1bSBub25lIj48Yj48c3BhbiBsYW5nPSJBUi1TQSIgZGlyPSJy dGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQiPjxmb250IGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+ 4drP4yDK4d7sIMfsINHTx8bhIOPkIOXQxyDH4eTm2iDt0czsIMfR08fhINPH4eUgzsfh7eUg2uHs IOXQxyDH4cft4+3hPC9mb250Pjwvc3Bhbj48L2I+PC9wPgoKPHAgc3R5bGU9IkJPUkRFUi1SSUdI VDogbWVkaXVtIG5vbmU7IFBBRERJTkctUklHSFQ6IDBpbjsgQk9SREVSLVRPUDogbWVkaXVtIG5v bmU7IFBBRERJTkctTEVGVDogMGluOyBQQURESU5HLUJPVFRPTTogMGluOyBNQVJHSU46IDBpbiAw aW4gMHB0OyBCT1JERVItTEVGVDogbWVkaXVtIG5vbmU7IFBBRERJTkctVE9QOiAwaW47IEJPUkRF Ui1CT1RUT006IG1lZGl1bSBub25lIj48Yj48c3BhbiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0Ij48 YSBvbmNsaWNrPSJyZXR1cm4gdG9wLmpzLk9wZW5FeHRMaW5rKHdpbmRvdyxldmVudCx0aGlzKSIg aHJlZj0ibWFpbHRvOlNvemFuMWVneXB0QGdtYWlsLmNvbSIgdGFyZ2V0PSJfYmxhbmsiPjxmb250 IGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+U296YW4xZWd5cHRAZ21haWwuY29tPC9mb250PjwvYT48 L3NwYW4+PC9iPjwvcD4KCjxwIHN0eWxlPSJCT1JERVItUklHSFQ6IG1lZGl1bSBub25lOyBQQURE SU5HLVJJR0hUOiAwaW47IEJPUkRFUi1UT1A6IG1lZGl1bSBub25lOyBQQURESU5HLUxFRlQ6IDBp bjsgUEFERElORy1CT1RUT006IDBpbjsgTUFSR0lOOiAwaW4gMGluIDBwdDsgQk9SREVSLUxFRlQ6 IG1lZGl1bSBub25lOyBQQURESU5HLVRPUDogMGluOyBCT1JERVItQk9UVE9NOiBtZWRpdW0gbm9u ZSI+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj48Yj48c3BhbiBsYW5nPSJBUi1TQSIgZGly PSJydGwiIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQiPubH0Mcg38fkIOHP7d/jINrR1iDU3skgLePe 0S3d7eHHPC9zcGFuPjwvYj48Yj48c3BhbiBsYW5nPSJBUi1FRyIgZGlyPSJydGwiIHN0eWxlPSJG T05ULVNJWkU6IDEwcHQiPi0g49Xk2iCWINXtz+HtyS3jztLkLePN4cfmIMfsIMfV5uEgx87R7Dwv c3Bhbj48L2I+PGI+PHNwYW4gbGFuZz0iQVItU0EiIGRpcj0icnRsIiBzdHlsZT0iRk9OVC1TSVpF OiAxMHB0Ij4g4eHH7czH0SDH5iDh4cjt2iDt49/k3+Mgx9HTx+Egyt3H1e3hIMfh2tHWIN/H4+HH IObt3dbhIObM5s8g1ebRIMfkIMfj3+Qg2uHsIOXQxyDH4cft4+3hPC9zcGFuPjwvYj48Yj48c3Bh biBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0Ij48L3NwYW4+PC9iPjwvZm9udD48L3A+Cgo8cCBzdHls ZT0iQk9SREVSLVJJR0hUOiBtZWRpdW0gbm9uZTsgUEFERElORy1SSUdIVDogMGluOyBCT1JERVIt VE9QOiBtZWRpdW0gbm9uZTsgUEFERElORy1MRUZUOiAwaW47IFBBRERJTkctQk9UVE9NOiAwaW47 IE1BUkdJTjogMGluIDBpbiAwcHQ7IEJPUkRFUi1MRUZUOiBtZWRpdW0gbm9uZTsgUEFERElORy1U T1A6IDBpbjsgQk9SREVSLUJPVFRPTTogbWVkaXVtIG5vbmUiPjxiPjxzcGFuIHN0eWxlPSJGT05U LVNJWkU6IDEwcHQiPjxhIG9uY2xpY2s9InJldHVybiB0b3AuanMuT3BlbkV4dExpbmsod2luZG93 LGV2ZW50LHRoaXMpIiBocmVmPSJtYWlsdG86bWFza2FubWFzcnlAZ21haWwuY29tIiB0YXJnZXQ9 Il9ibGFuayI+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj5tYXNrYW5tYXNyeUBnbWFpbC5j b208L2ZvbnQ+PC9hPjwvc3Bhbj48L2I+PC9wPgoKPHAgc3R5bGU9IkJPUkRFUi1SSUdIVDogbWVk aXVtIG5vbmU7IFBBRERJTkctUklHSFQ6IDBpbjsgQk9SREVSLVRPUDogbWVkaXVtIG5vbmU7IFBB RERJTkctTEVGVDogMGluOyBQQURESU5HLUJPVFRPTTogMGluOyBNQVJHSU46IDBpbiAwaW4gMHB0 OyBCT1JERVItTEVGVDogbWVkaXVtIG5vbmU7IFBBRERJTkctVE9QOiAwaW47IEJPUkRFUi1CT1RU T006IG1lZGl1bSBub25lIj48Yj48c3BhbiBsYW5nPSJBUi1TQSIgZGlyPSJydGwiIHN0eWxlPSJG T05ULVNJWkU6IDEwcHQiPjxmb250IGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+5sfQxyDfx+Qgx+Ha 0dYgx+Hj0dPhINvt0SDj5MfTyCDt0czsIMfR08fhINjhyN/jINrh7CDl0Mcgx+HH7ePt4TwvZm9u dD48L3NwYW4+PC9iPjwvcD4KCjxwIHN0eWxlPSJCT1JERVItUklHSFQ6IG1lZGl1bSBub25lOyBQ QURESU5HLVJJR0hUOiAwaW47IEJPUkRFUi1UT1A6IG1lZGl1bSBub25lOyBQQURESU5HLUxFRlQ6 IDBpbjsgUEFERElORy1CT1RUT006IDBpbjsgTUFSR0lOOiAwaW4gMGluIDBwdDsgQk9SREVSLUxF RlQ6IG1lZGl1bSBub25lOyBQQURESU5HLVRPUDogMGluOyBCT1JERVItQk9UVE9NOiBtZWRpdW0g bm9uZSI+PGI+PHNwYW4gc3R5bGU9IkZPTlQtU0laRTogMTBwdCI+PGZvbnQgZmFjZT0iVGltZXMg TmV3IFJvbWFuIj48YSBvbmNsaWNrPSJyZXR1cm4gdG9wLmpzLk9wZW5FeHRMaW5rKHdpbmRvdyxl dmVudCx0aGlzKSIgaHJlZj0ibWFpbHRvOkhhbmFuMWVneXB0QGdtYWlsLmNvbSIgdGFyZ2V0PSJf YmxhbmsiPkhhbmFuMWVneXB0QGdtYWlsLmNvbTwvYT48c3BhbiBkaXI9InJ0bCI+PC9zcGFuPjxz cGFuIGxhbmc9IkFSLVNBIiBkaXI9InJ0bCI+PHNwYW4gZGlyPSJydGwiPjwvc3Bhbj4gPC9zcGFu PjwvZm9udD48L3NwYW4+PC9iPjwvcD4KCjxwIHN0eWxlPSJCT1JERVItUklHSFQ6IG1lZGl1bSBu b25lOyBQQURESU5HLVJJR0hUOiAwaW47IEJPUkRFUi1UT1A6IG1lZGl1bSBub25lOyBQQURESU5H LUxFRlQ6IDBpbjsgUEFERElORy1CT1RUT006IDBpbjsgTUFSR0lOOiAwaW4gMGluIDBwdDsgQk9S REVSLUxFRlQ6IG1lZGl1bSBub25lOyBQQURESU5HLVRPUDogMGluOyBCT1JERVItQk9UVE9NOiBt ZWRpdW0gbm9uZSI+PGI+PHNwYW4gbGFuZz0iQVItU0EiIGRpcj0icnRsIiBzdHlsZT0iRk9OVC1T SVpFOiAxMHB0Ij48Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPuPaIMrN7cfKIDwvZm9udD48 L3NwYW4+PC9iPjwvcD4KCjxwIHN0eWxlPSJCT1JERVItUklHSFQ6IG1lZGl1bSBub25lOyBQQURE SU5HLVJJR0hUOiAwaW47IEJPUkRFUi1UT1A6IG1lZGl1bSBub25lOyBQQURESU5HLUxFRlQ6IDBp bjsgUEFERElORy1CT1RUT006IDBpbjsgTUFSR0lOOiAwaW4gMGluIDBwdDsgQk9SREVSLUxFRlQ6 IG1lZGl1bSBub25lOyBQQURESU5HLVRPUDogMGluOyBCT1JERVItQk9UVE9NOiBtZWRpdW0gbm9u ZSI+PGI+PHNwYW4gbGFuZz0iQVItU0EiIGRpcj0icnRsIiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0 Ij48Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPuPT3+Qg49XR7DwvZm9udD48L3NwYW4+PC9i PjwvcD4KPC9kaXY+CjxwIHN0eWxlPSJNQVJHSU46IDBpbiAwaW4gMHB0IDE4OXB0Ij48Yj48c3Bh biBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9t YW4mIzM5OyI+PGEgb25jbGljaz0icmV0dXJuIHRvcC5qcy5PcGVuRXh0TGluayh3aW5kb3csZXZl bnQsdGhpcykiIGhyZWY9Imh0dHA6Ly93d3cubWFza2FubWFzcnkuY29tLyIgdGFyZ2V0PSJfYmxh bmsiPnd3dy5tYXNrYW5tYXNyeS5jb208L2E+PC9zcGFuPjwvYj48L3A+Cjwvc3Bhbj48L2Rpdj4K ------=_Part_144361_12721996.1231106966208-- From david@fromorbit.com Sun Jan 4 16:45:50 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n04Mjo0I001725 for ; Sun, 4 Jan 2009 16:45:50 -0600 X-ASG-Debug-ID: 1231109148-3b9602dc0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from ipmail05.adl2.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id ABF9313D152C for ; Sun, 4 Jan 2009 14:45:48 -0800 (PST) Received: from ipmail05.adl2.internode.on.net (ipmail05.adl2.internode.on.net [203.16.214.145]) by cuda.sgi.com with ESMTP id qKxfbPWmOyr1WWpL for ; Sun, 04 Jan 2009 14:45:48 -0800 (PST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApoEAH7HYEl5LCBV/2dsb2JhbADJM4Vy X-IronPort-AV: E=Sophos;i="4.36,329,1228051800"; d="scan'208";a="286445804" Received: from ppp121-44-32-85.lns10.syd7.internode.on.net (HELO disturbed) ([121.44.32.85]) by ipmail05.adl2.internode.on.net with ESMTP; 05 Jan 2009 09:10:13 +1030 Received: from dave by disturbed with local (Exim 4.69) (envelope-from ) id 1LJbdj-00006R-I2; Mon, 05 Jan 2009 09:40:11 +1100 Date: Mon, 5 Jan 2009 09:40:11 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] sanity check attr fork size Subject: Re: [PATCH] sanity check attr fork size Message-ID: <20090104224011.GK10725@disturbed> Mail-Followup-To: Christoph Hellwig , xfs@oss.sgi.com References: <20090104164211.GA15734@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090104164211.GA15734@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: ipmail05.adl2.internode.on.net[203.16.214.145] X-Barracuda-Start-Time: 1231109149 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14432 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Jan 04, 2009 at 11:42:11AM -0500, Christoph Hellwig wrote: > Recently we have quite a few kerneloops reports about dereferencing a NULL > if_data in the attribute fork. From looking over the code this can only > happen if we pass a 0 size argument to xfs_iformat_local. This implies some > sort of corruption and in fact the only mailinglist report about this from > earlier this year was after a powerfail presumably on a system with write > cache and without barriers. > > Add a quick sanity check for the attr fork size in xfs_iformat to catch > these early and without an oops. Looks sane to me. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From help1@uni-potsdam.de Sun Jan 4 18:22:08 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.3 required=5.0 tests=BAYES_60,MIME_8BIT_HEADER autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n050M8kH006987 for ; Sun, 4 Jan 2009 18:22:08 -0600 X-ASG-Debug-ID: 1231114925-714403da0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from olc-14.verat.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 53AE717A5468 for ; Sun, 4 Jan 2009 16:22:05 -0800 (PST) Received: from olc-14.verat.net (olc-14.verat.net [62.108.127.40]) by cuda.sgi.com with ESMTP id 7f7RhDtqS7ZGCPp7 for ; Sun, 04 Jan 2009 16:22:05 -0800 (PST) Received: from webmail.verat.net (webmail.verat.net [85.222.160.153]) by olc-14.verat.net (Postfix) with ESMTP id 1649AC05E8; Mon, 5 Jan 2009 01:11:50 +0100 (CET) Received: from 41.220.75.3 (SquirrelMail authenticated user kosovac) by webmail.verat.net with HTTP; Mon, 5 Jan 2009 01:21:31 +0100 (CET) Message-ID: <36217.41.220.75.3.1231114891.squirrel@webmail.verat.net> Date: Mon, 5 Jan 2009 01:21:31 +0100 (CET) X-ASG-Orig-Subj: Sehr geehrte uni-potsdam.de Account Benutzer, Subject: Sehr geehrte uni-potsdam.de Account Benutzer, From: W3-TEAM =?iso-8859-1?Q?Universit=E4t_Potsdam?= Reply-To: webmasteronlineservice17@gmail.com User-Agent: SquirrelMail/1.4.13 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-Barracuda-Connect: olc-14.verat.net[62.108.127.40] X-Barracuda-Start-Time: 1231114927 X-Barracuda-Bayes: INNOCENT GLOBAL 0.5134 1.0000 0.7500 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.75 X-Barracuda-Spam-Status: No, SCORE=0.75 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Sehr geehrte uni-potsdam.de Account Benutzer, Es wird ein Upgrade in unserem System zwischen 5 bis 16 Januar 2009. Durch die anonyme Registrierung von uni-potsdam.deaccounts und die Anzahl der ruhende Konten, werden wir mit diesem Upgrade zu bestimmen, die genaue Zahl der Teilnehmer haben wir derzeit. Sie sind beauftragt, um sich bei Ihrer uni-potsdam.deto ob Ihr Konto ist immer noch gültig und senden Sie sofort die folgenden: Login-Name :................................( Obligatorische) Passwort :...................................( Obligatorische) Geburtsdatum :..............................( Optional) Staat :........................................( Optional) Vor dem Senden Ihrer Angaben an uns, Sie werden beraten, um in diesem Login Link: https: / / webmail.uni-potsdam.de/horde/login.php Beachten Sie, dass, wenn Ihr Konto nicht anmelden, senden Sie uns die Details oder sonst bedeutet es, Es wurde gestrichen. Sorry für die inconvinence Dies könnte dazu führen, dass Sie sind wir nur versuchen, um sicherzustellen, dass Sie nicht verlieren Informationen in Ihre Konten. Alles, was Sie zu tun haben, ist Klicken Sie auf Antwort und geben Sie die oben genannten Informationen, Ihr Konto wird nicht unterbrochen werden und wird auch weiterhin wie gewohnt. Vielen Dank für Ihre Aufmerksamkeit auf diese Aufforderung. Wir entschuldigen uns noch einmal für alle Unannehmlichkeiten. Warnung! Konto-Nutzer, die sich weigern, ihre Rechnung nach 5 Tagen nach Erhalt dieser Warnung, Benutzer verliert sein Konto dauerhaft. © 2009 uni-potsdam.de (W3-TEAM Universität Potsdam) From npiggin@suse.de Sun Jan 4 19:48:26 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n051mQT5011760 for ; Sun, 4 Jan 2009 19:48:26 -0600 X-ASG-Debug-ID: 1231120104-150f02cd0000-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 126585EED6 for ; Sun, 4 Jan 2009 17:48:24 -0800 (PST) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id gCOPWUwFBhxsHUgl for ; Sun, 04 Jan 2009 17:48:24 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation Received: from Relay1.suse.de (relay-ext.suse.de [195.135.221.8]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id DAD1445876; Mon, 5 Jan 2009 02:48:23 +0100 (CET) Date: Mon, 5 Jan 2009 02:48:21 +0100 From: Nick Piggin To: Christoph Hellwig Cc: Peter Klotz , Roman Kononov , linux-kernel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: BUG: soft lockup - is this XFS problem? Subject: Re: BUG: soft lockup - is this XFS problem? Message-ID: <20090105014821.GA367@wotan.suse.de> References: <20081223171259.GA11945@infradead.org> <20081230042333.GC27679@wotan.suse.de> <20090103214443.GA6612@infradead.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090103214443.GA6612@infradead.org> User-Agent: Mutt/1.5.9i X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1231120106 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com On Sat, Jan 03, 2009 at 04:44:43PM -0500, Christoph Hellwig wrote: > On Tue, Dec 30, 2008 at 05:23:33AM +0100, Nick Piggin wrote: > > On Tue, Dec 23, 2008 at 12:12:59PM -0500, Christoph Hellwig wrote: > > > > > > Nick, I've seen various reports like this by Roman. It seems to be > > > caused by an interaction of the lockless pagecache with the xfs > > > I/O code. Any idea what might be wrong here: > > > > Hmm, it could get into a loop here if there is a page in the pagecache > > with a zero refcount, which might be a problem with XFS... other looping > > conditions might indicate a problem iwth lockless pagecache or radix > > tree. It would be very helpful to know what condition it is looping on... > > See http://oss.sgi.com/bugzilla/show_bug.cgi?id=805 OK.. Hmm, well here is a modification to your patch which might help further. I'll see if I can reproduce it here meanwhile. --- mm/filemap.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) Index: linux-2.6/mm/filemap.c =================================================================== --- linux-2.6.orig/mm/filemap.c +++ linux-2.6/mm/filemap.c @@ -770,11 +770,13 @@ EXPORT_SYMBOL(find_or_create_page); * find_get_pages() returns the number of pages which were found. */ unsigned find_get_pages(struct address_space *mapping, pgoff_t start, - unsigned int nr_pages, struct page **pages) + unsigned int nr_pages, + struct page **pages) { unsigned int i; unsigned int ret; unsigned int nr_found; + int locked = 0; rcu_read_lock(); restart: @@ -785,27 +787,46 @@ restart: struct page *page; repeat: page = radix_tree_deref_slot((void **)pages[i]); - if (unlikely(!page)) + if (unlikely(!page)) { + if (printk_ratelimit()) + printk(KERN_INFO "unable to deref page\n"); continue; + } + /* * this can only trigger if nr_found == 1, making livelock * a non issue. */ - if (unlikely(page == RADIX_TREE_RETRY)) + if (unlikely(page == RADIX_TREE_RETRY)) { + printk(KERN_INFO "got RADIX_TREE_RETRY\n"); goto restart; + } - if (!page_cache_get_speculative(page)) + if (!page_cache_get_speculative(page)) { + /* If the page is in the radix-tree, and the radix-tree + * is locked, the page must have a non-zero refcount */ + BUG_ON(locked); + printk(KERN_INFO "page_cache_get failed\n"); + spin_lock_irq(&mapping->tree_lock); + locked = 1; goto repeat; + } /* Has the page moved? */ if (unlikely(page != *((void **)pages[i]))) { + BUG_ON(locked); + printk(KERN_INFO "page moved\n"); page_cache_release(page); + spin_lock_irq(&mapping->tree_lock); + locked = 1; goto repeat; } pages[ret] = page; ret++; } + if (locked) + spin_unlock_irq(&mapping->tree_lock); rcu_read_unlock(); return ret; } From lachlan@sgi.com Sun Jan 4 21:09:09 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n053983T016300 for ; Sun, 4 Jan 2009 21:09:09 -0600 Received: from [134.14.55.78] (redback.melbourne.sgi.com [134.14.55.78]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9BD3030406B; Sun, 4 Jan 2009 19:09:03 -0800 (PST) Message-ID: <49617A4D.2090200@sgi.com> Date: Mon, 05 Jan 2009 14:11:09 +1100 From: Lachlan McIlroy Reply-To: lachlan@sgi.com Organization: SGI User-Agent: Thunderbird 2.0.0.19 (X11/20081209) MIME-Version: 1.0 To: Christoph Hellwig CC: Arkadiusz Miskiewicz , xfs@oss.sgi.com Subject: Re: [PATCH, RFC] xfs_repair: allow filesystems with a single AG References: <20081224231901.GA652@infradead.org> In-Reply-To: <20081224231901.GA652@infradead.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Looks fine to me but I feel that repair is compromised without the second SB so we should fix mkfs too to prevent people from creating single AG filesystems. Christoph Hellwig wrote: > Currently xfs_repair bails out on a filesystem with just a single AG. > But that's a perfectly valid configureation, so we should allow it. > > Skip the geomery validation because we simply can't do it if we don't > have a secondary SB, and make sure to take the internal log into account > when guestimating the first inode cluster. > > I'll also cook up a testcase for repair on single AG filesystems. > > > Signed-off-by: Christoph Hellwig > Reported-By: Arkadiusz Miskiewicz > > Index: xfsprogs/repair/sb.c > =================================================================== > --- xfsprogs.orig/repair/sb.c 2008-12-24 23:36:29.946033933 +0100 > +++ xfsprogs/repair/sb.c 2008-12-24 23:42:08.101044710 +0100 > @@ -773,14 +773,17 @@ verify_set_primary_sb(xfs_sb_t *rsb, > break; > case 1: > /* > - * just report the geometry info and get out. > - * refuse to run further unless the force (-F) > - * option is in effect. > + * If we only have a single allocation group there is no > + * secondary superblock that we can use to verify the geometry > + * information. Not much we can do here, as we don't want > + * to prevent the user from checking the filesystem. > + * > + * XXX(hch): We should allow putting a secondary superblock > + * into the last sector of a filesystem to so that > + * we can still have a backup for single allocation > + * group filesystems. > */ > - if (!force_geo) { > - do_warn(_("Only one AG detected - cannot proceed.\n")); > - exit(1); > - } > + break; > default: > /* > * at least half of the probed superblocks have > Index: xfsprogs/repair/xfs_repair.c > =================================================================== > --- xfsprogs.orig/repair/xfs_repair.c 2008-12-25 00:00:09.116033372 +0100 > +++ xfsprogs/repair/xfs_repair.c 2008-12-25 00:07:50.295036179 +0100 > @@ -409,6 +409,19 @@ calc_mkfs(xfs_mount_t *mp) > fino_bno = inobt_root + XFS_MIN_FREELIST_RAW(1, 1, mp) + 1; > > /* > + * If we only have a single allocation group the log is also allocated > + * in the first allocation group and we need to add the number of > + * blocks used by the log to the above calculation. > + * All this of course doesn't apply if we have an external log. > + */ > + if (mp->m_sb.sb_agcount == 1 && mp->m_sb.sb_logstart) { > + /* > + * XXX(hch): verify that sb_logstart makes sense? > + */ > + fino_bno += mp->m_sb.sb_logblocks; > + } > + > + /* > * ditto the location of the first inode chunks in the fs ('/') > */ > if (xfs_sb_version_hasdalign(&mp->m_sb) && do_inoalign) { > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From lachlan@sgi.com Sun Jan 4 21:25:22 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n053PMCi017454 for ; Sun, 4 Jan 2009 21:25:22 -0600 Received: from [134.14.55.78] (redback.melbourne.sgi.com [134.14.55.78]) by relay2.corp.sgi.com (Postfix) with ESMTP id 43AD630406C; Sun, 4 Jan 2009 19:25:19 -0800 (PST) Message-ID: <49617E1F.7070305@sgi.com> Date: Mon, 05 Jan 2009 14:27:27 +1100 From: Lachlan McIlroy Reply-To: lachlan@sgi.com Organization: SGI User-Agent: Thunderbird 2.0.0.19 (X11/20081209) MIME-Version: 1.0 To: Nick Piggin CC: xfs@oss.sgi.com Subject: Re: [GIT PULL] XFS update for 2.6.29 References: <20081230030845.A4F0558AE206@chook.melbourne.sgi.com> <200812311419.10199.nickpiggin@yahoo.com.au> In-Reply-To: <200812311419.10199.nickpiggin@yahoo.com.au> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Nick Piggin wrote: > On Tuesday 30 December 2008 14:08:45 Lachlan McIlroy wrote: >> The following changes since commit >> 3c92ec8ae91ecf59d88c798301833d7cf83f2179: Linus Torvalds (1): >> Merge branch 'next' of git://git.kernel.org/.../paulus/powerpc >> >> are available in the git repository at: >> >> git://oss.sgi.com/oss/git/xfs/xfs.git for-linus > > Any reason you're not merging those vmap patches? > Sorry Nick, I didn't realise we missed them. Can you provide a pointer to them and I'll pull them in. Lachlan From npiggin@suse.de Sun Jan 4 22:20:04 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n054K4Ve021201 for ; Sun, 4 Jan 2009 22:20:04 -0600 X-ASG-Debug-ID: 1231129202-260102c50000-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 042455F2ED for ; Sun, 4 Jan 2009 20:20:02 -0800 (PST) Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id BMldiPia0hvLJWvx for ; Sun, 04 Jan 2009 20:20:02 -0800 (PST) Received: from Relay2.suse.de (mail2.suse.de [195.135.221.8]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id 0E32948473; Mon, 5 Jan 2009 05:20:00 +0100 (CET) Date: Mon, 5 Jan 2009 05:19:59 +0100 From: Nick Piggin To: Christoph Hellwig Cc: Peter Klotz , Roman Kononov , linux-kernel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: BUG: soft lockup - is this XFS problem? Subject: Re: BUG: soft lockup - is this XFS problem? Message-ID: <20090105041959.GC367@wotan.suse.de> References: <20081223171259.GA11945@infradead.org> <20081230042333.GC27679@wotan.suse.de> <20090103214443.GA6612@infradead.org> <20090105014821.GA367@wotan.suse.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090105014821.GA367@wotan.suse.de> User-Agent: Mutt/1.5.9i X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1231129204 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14455 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Jan 05, 2009 at 02:48:21AM +0100, Nick Piggin wrote: > On Sat, Jan 03, 2009 at 04:44:43PM -0500, Christoph Hellwig wrote: > > On Tue, Dec 30, 2008 at 05:23:33AM +0100, Nick Piggin wrote: > > > On Tue, Dec 23, 2008 at 12:12:59PM -0500, Christoph Hellwig wrote: > > > > > > > > Nick, I've seen various reports like this by Roman. It seems to be > > > > caused by an interaction of the lockless pagecache with the xfs > > > > I/O code. Any idea what might be wrong here: > > > > > > Hmm, it could get into a loop here if there is a page in the pagecache > > > with a zero refcount, which might be a problem with XFS... other looping > > > conditions might indicate a problem iwth lockless pagecache or radix > > > tree. It would be very helpful to know what condition it is looping on... > > > > See http://oss.sgi.com/bugzilla/show_bug.cgi?id=805 > > OK.. Hmm, well here is a modification to your patch which might help further. > I'll see if I can reproduce it here meanwhile. I have reproduced it. It seems like it might be a livelock condition because the system ended up recovering after I terminated the dd (and did so before I collected any real info, oops, hopefully I can reproduce it again). This would fit with the problem going away when the debugging patch was applied. Timing changes... From npiggin@suse.de Mon Jan 5 00:48:49 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n056ml6w030728 for ; Mon, 5 Jan 2009 00:48:49 -0600 X-ASG-Debug-ID: 1231138120-2fa702810000-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 D8D4E5F106 for ; Sun, 4 Jan 2009 22:48:41 -0800 (PST) Received: from mx1.suse.de (ns.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id WWnFAH7lLMBIAl7u for ; Sun, 04 Jan 2009 22:48:41 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation Received: from Relay1.suse.de (relay-ext.suse.de [195.135.221.8]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 6022F446AF; Mon, 5 Jan 2009 07:48:39 +0100 (CET) Date: Mon, 5 Jan 2009 07:48:38 +0100 From: Nick Piggin To: Christoph Hellwig Cc: Peter Klotz , Roman Kononov , linux-kernel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: BUG: soft lockup - is this XFS problem? Subject: Re: BUG: soft lockup - is this XFS problem? Message-ID: <20090105064838.GA5209@wotan.suse.de> References: <20081223171259.GA11945@infradead.org> <20081230042333.GC27679@wotan.suse.de> <20090103214443.GA6612@infradead.org> <20090105014821.GA367@wotan.suse.de> <20090105041959.GC367@wotan.suse.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090105041959.GC367@wotan.suse.de> User-Agent: Mutt/1.5.9i X-Barracuda-Connect: ns.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1231138126 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com On Mon, Jan 05, 2009 at 05:19:59AM +0100, Nick Piggin wrote: > On Mon, Jan 05, 2009 at 02:48:21AM +0100, Nick Piggin wrote: > > > > OK.. Hmm, well here is a modification to your patch which might help further. > > I'll see if I can reproduce it here meanwhile. > > I have reproduced it. It seems like it might be a livelock condition > because the system ended up recovering after I terminated the dd (and > did so before I collected any real info, oops, hopefully I can > reproduce it again). > > This would fit with the problem going away when the debugging patch > was applied. Timing changes... No, I was wrong. The problem goes away with the patch applied because a function call == a compiler barrier. The problem randomly recovered for me because of something more subtle. I believe this patch should solve it. Please test and confirm before I send it upstream. --- An XFS workload showed up a bug in the lockless pagecache patch. Basically it would go into an "infinite" loop, although it would sometimes be able to break out of the loop! The reason is a missing compiler barrier in the "increment reference count unless it was zero" case of the lockless pagecache protocol in the gang lookup functions. This would cause the compiler to use a cached value of struct page pointer to retry the operation with, rather than reload it. So the page might have been removed from pagecache and freed (refcount==0) but the lookup would not correctly notice the page is no longer in pagecache, and keep attempting to increment the refcount and failing, until the page gets reallocated for something else. This isn't a data corruption because the condition will be detected if the page has been reallocated. However it can result in a lockup. Add a the required compiler barrier and comment to fix this. Assembly snippet from find_get_pages, before: .L220: movq (%rbx), %rax #* ivtmp.1162, tmp82 movq (%rax), %rdi #, prephitmp.1149 .L218: testb $1, %dil #, prephitmp.1149 jne .L217 #, testq %rdi, %rdi # prephitmp.1149 je .L203 #, cmpq $-1, %rdi #, prephitmp.1149 je .L217 #, movl 8(%rdi), %esi # ._count.counter, c testl %esi, %esi # c je .L218 #, after: .L212: movq (%rbx), %rax #* ivtmp.1109, tmp81 movq (%rax), %rdi #, ret testb $1, %dil #, ret jne .L211 #, testq %rdi, %rdi # ret je .L197 #, cmpq $-1, %rdi #, ret je .L211 #, movl 8(%rdi), %esi # ._count.counter, c testl %esi, %esi # c je .L212 #, (notice the obvious infinite loop in the first example, if page->count remains 0) --- Index: linux-2.6/mm/filemap.c =================================================================== --- linux-2.6.orig/mm/filemap.c 2009-01-05 17:22:57.000000000 +1100 +++ linux-2.6/mm/filemap.c 2009-01-05 17:28:40.000000000 +1100 @@ -794,8 +794,19 @@ repeat: if (unlikely(page == RADIX_TREE_RETRY)) goto restart; - if (!page_cache_get_speculative(page)) + if (!page_cache_get_speculative(page)) { + /* + * A failed page_cache_get_speculative operation does + * not imply any barriers (Documentation/atomic_ops.txt), + * and as such, we must force the compiler to deref the + * radix-tree slot again rather than using the cached + * value (because we need to give up if the page has been + * removed from the radix-tree, rather than looping until + * it gets reused for something else). + */ + barrier(); goto repeat; + } /* Has the page moved? */ if (unlikely(page != *((void **)pages[i]))) { @@ -850,8 +861,11 @@ repeat: if (page->mapping == NULL || page->index != index) break; - if (!page_cache_get_speculative(page)) + if (!page_cache_get_speculative(page)) { + /* barrier: see find_get_pages() */ + barrier(); goto repeat; + } /* Has the page moved? */ if (unlikely(page != *((void **)pages[i]))) { @@ -904,8 +918,11 @@ repeat: if (unlikely(page == RADIX_TREE_RETRY)) goto restart; - if (!page_cache_get_speculative(page)) + if (!page_cache_get_speculative(page)) { + /* barrier: see find_get_pages() */ + barrier(); goto repeat; + } /* Has the page moved? */ if (unlikely(page != *((void **)pages[i]))) { From kononov@ftml.net Mon Jan 5 08:25:40 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n05EPdx0025668 for ; Mon, 5 Jan 2009 08:25:40 -0600 X-ASG-Debug-ID: 1231165539-486802b10000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from out2.smtp.messagingengine.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 36C2D174B322 for ; Mon, 5 Jan 2009 06:25:39 -0800 (PST) Received: from out2.smtp.messagingengine.com (out2.smtp.messagingengine.com [66.111.4.26]) by cuda.sgi.com with ESMTP id WAB49kjt3bXakDlu for ; Mon, 05 Jan 2009 06:25:39 -0800 (PST) Received: from compute2.internal (compute2.internal [10.202.2.42]) by out1.messagingengine.com (Postfix) with ESMTP id 778592022E3; Mon, 5 Jan 2009 09:25:07 -0500 (EST) Received: from heartbeat2.messagingengine.com ([10.202.2.161]) by compute2.internal (MEProxy); Mon, 05 Jan 2009 09:25:07 -0500 X-Sasl-enc: p0ii0BFEGz/E6Rn57sv60RAT2mRzZiv49Ak2u5vYfUMt 1231165507 Received: from hole.wormery.net (adsl-70-131-211-107.dsl.emhril.sbcglobal.net [70.131.211.107]) by mail.messagingengine.com (Postfix) with ESMTPSA id 2867431B6E; Mon, 5 Jan 2009 09:25:07 -0500 (EST) Received: from [192.168.130.197] (aaa.wormery.net [192.168.130.197]) by hole.wormery.net (Postfix) with ESMTP id E39B71E4135; Mon, 5 Jan 2009 08:25:05 -0600 (CST) Message-ID: <49621841.7040108@ftml.net> Date: Mon, 05 Jan 2009 08:25:05 -0600 From: Roman Kononov User-Agent: Thunderbird 2.0.0.18 (X11/20081125) MIME-Version: 1.0 To: Nick Piggin CC: Christoph Hellwig , Peter Klotz , Roman Kononov , linux-kernel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: BUG: soft lockup - is this XFS problem? Subject: Re: BUG: soft lockup - is this XFS problem? References: <20081223171259.GA11945@infradead.org> <20081230042333.GC27679@wotan.suse.de> <20090103214443.GA6612@infradead.org> <20090105014821.GA367@wotan.suse.de> <20090105041959.GC367@wotan.suse.de> <20090105064838.GA5209@wotan.suse.de> In-Reply-To: <20090105064838.GA5209@wotan.suse.de> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: out2.smtp.messagingengine.com[66.111.4.26] X-Barracuda-Start-Time: 1231165539 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14486 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 2009-01-05 00:48 Nick Piggin said the following: > I believe this patch should solve it. Please test and confirm before > I send it upstream. 3 systems with 2.6.27.10 have worked overnight with dd running continuously. They all failed within 20 minutes without the patch. Thank you, Roman From peter.klotz@aon.at Mon Jan 5 10:22:01 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n05GM1BA000637 for ; Mon, 5 Jan 2009 10:22:01 -0600 X-ASG-Debug-ID: 1231172518-141b03b50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from email.aon.at (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6BCC16140A for ; Mon, 5 Jan 2009 08:21:59 -0800 (PST) Received: from email.aon.at (nat-warsl417-02.aon.at [195.3.96.120]) by cuda.sgi.com with ESMTP id 8kgcE7aDSuiEHP2g for ; Mon, 05 Jan 2009 08:21:59 -0800 (PST) Received: (qmail 18565 invoked from network); 5 Jan 2009 16:21:58 -0000 Received: from smarthub93.highway.telekom.at (HELO email.aon.at) ([172.18.5.237]) (envelope-sender ) by fallback44.highway.telekom.at (qmail-ldap-1.03) with SMTP for ; 5 Jan 2009 16:21:58 -0000 Received: (qmail 26826 invoked from network); 5 Jan 2009 16:21:25 -0000 Received: from 91-114-253-96.adsl.highway.telekom.at (HELO [192.168.0.100]) ([91.114.253.96]) (envelope-sender ) by smarthub93.highway.telekom.at (qmail-ldap-1.03) with SMTP for ; 5 Jan 2009 16:21:25 -0000 Message-ID: <49623384.2070801@aon.at> Date: Mon, 05 Jan 2009 17:21:24 +0100 From: Peter Klotz User-Agent: Thunderbird 2.0.0.18 (X11/20081125) MIME-Version: 1.0 To: Nick Piggin CC: Christoph Hellwig , Roman Kononov , linux-kernel@vger.kernel.org, xfs@oss.sgi.com X-ASG-Orig-Subj: Re: BUG: soft lockup - is this XFS problem? Subject: Re: BUG: soft lockup - is this XFS problem? References: <20081223171259.GA11945@infradead.org> <20081230042333.GC27679@wotan.suse.de> <20090103214443.GA6612@infradead.org> <20090105014821.GA367@wotan.suse.de> <20090105041959.GC367@wotan.suse.de> <20090105064838.GA5209@wotan.suse.de> In-Reply-To: <20090105064838.GA5209@wotan.suse.de> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: nat-warsl417-02.aon.at[195.3.96.120] X-Barracuda-Start-Time: 1231172520 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14492 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Nick Piggin wrote: > I believe this patch should solve it. Please test and confirm before > I send it upstream. My test successfully completed two times, writing a 900GB file in each run. I used a patched 2.6.27.10 x86_64 kernel. On an unpatched system this test usually fails before reaching 100GB. Thank you for fixing this issue that quick. Regards, Peter. From npiggin@suse.de Mon Jan 5 10:41:39 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n05GfdxN001615 for ; Mon, 5 Jan 2009 10:41:39 -0600 X-ASG-Debug-ID: 1231173697-32cb00340000-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 32F9717A8083 for ; Mon, 5 Jan 2009 08:41:37 -0800 (PST) Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id 66IUWFrWoGhEExiS for ; Mon, 05 Jan 2009 08:41:37 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation Received: from Relay1.suse.de (mail2.suse.de [195.135.221.8]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id EE62C44A32; Mon, 5 Jan 2009 17:41:35 +0100 (CET) Date: Mon, 5 Jan 2009 17:41:35 +0100 From: Nick Piggin To: Peter Klotz , Linus Torvalds , stable@kernel.org, Linux Memory Management List Cc: Christoph Hellwig , Roman Kononov , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Andrew Morton X-ASG-Orig-Subj: [patch] mm: fix lockless pagecache reordering bug (was Re: BUG: soft lockup - is this XFS problem?) Subject: [patch] mm: fix lockless pagecache reordering bug (was Re: BUG: soft lockup - is this XFS problem?) Message-ID: <20090105164135.GC32675@wotan.suse.de> References: <20081223171259.GA11945@infradead.org> <20081230042333.GC27679@wotan.suse.de> <20090103214443.GA6612@infradead.org> <20090105014821.GA367@wotan.suse.de> <20090105041959.GC367@wotan.suse.de> <20090105064838.GA5209@wotan.suse.de> <49623384.2070801@aon.at> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <49623384.2070801@aon.at> User-Agent: Mutt/1.5.9i X-Barracuda-Connect: cantor.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1231173699 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com Hi, This patch should be applied to 2.6.29 and 27/28 stable kernels, please. -- Peter Klotz and Roman Kononov both reported a bug where in XFS workloads where they were seeing softlockups in find_get_pages (http://oss.sgi.com/bugzilla/show_bug.cgi?id=805). Basically it would go into an "infinite" loop, although it would sometimes be able to break out of the loop depending on the phase of the moon. This turns out to be a bug in the lockless pagecache patch. There is a missing compiler barrier in the "increment reference count unless it was zero" failure case of the lockless pagecache protocol in the gang lookup functions. This would cause the compiler to use a cached value of struct page pointer to retry the operation with, rather than reload it. So the page might have been removed from pagecache and freed (refcount==0) but the lookup would not correctly notice the page is no longer in pagecache, and keep attempting to increment the refcount and failing, until the page gets reallocated for something else. This isn't a data corruption because the condition will be properly handled if the page does get reallocated. However it can result in a lockup. Add a the required compiler barrier and comment to fix this. Assembly snippet from find_get_pages, before: .L220: movq (%rbx), %rax #* ivtmp.1162, tmp82 movq (%rax), %rdi #, prephitmp.1149 .L218: testb $1, %dil #, prephitmp.1149 jne .L217 #, testq %rdi, %rdi # prephitmp.1149 je .L203 #, cmpq $-1, %rdi #, prephitmp.1149 je .L217 #, movl 8(%rdi), %esi # ._count.counter, c testl %esi, %esi # c je .L218 #, after: .L212: movq (%rbx), %rax #* ivtmp.1109, tmp81 movq (%rax), %rdi #, ret testb $1, %dil #, ret jne .L211 #, testq %rdi, %rdi # ret je .L197 #, cmpq $-1, %rdi #, ret je .L211 #, movl 8(%rdi), %esi # ._count.counter, c testl %esi, %esi # c je .L212 #, (notice the obvious infinite loop in the first example, if page->count remains 0) The problem was noticed and resolved on 2.6.27 stable kernels, and also applies upstream (where I was able to reproduce it and verify the fix). Reported-by: Peter Klotz Reported-by: Roman Kononov Tested-by: Peter Klotz Tested-by: Roman Kononov Signed-off-by: Nick Piggin --- Index: linux-2.6/mm/filemap.c =================================================================== --- linux-2.6.orig/mm/filemap.c 2009-01-05 17:22:57.000000000 +1100 +++ linux-2.6/mm/filemap.c 2009-01-05 17:28:40.000000000 +1100 @@ -794,8 +794,19 @@ repeat: if (unlikely(page == RADIX_TREE_RETRY)) goto restart; - if (!page_cache_get_speculative(page)) + if (!page_cache_get_speculative(page)) { + /* + * A failed page_cache_get_speculative operation does + * not imply any barriers (Documentation/atomic_ops.txt), + * and as such, we must force the compiler to deref the + * radix-tree slot again rather than using the cached + * value (because we need to give up if the page has been + * removed from the radix-tree, rather than looping until + * it gets reused for something else). + */ + barrier(); goto repeat; + } /* Has the page moved? */ if (unlikely(page != *((void **)pages[i]))) { @@ -850,8 +861,11 @@ repeat: if (page->mapping == NULL || page->index != index) break; - if (!page_cache_get_speculative(page)) + if (!page_cache_get_speculative(page)) { + /* barrier: see find_get_pages() */ + barrier(); goto repeat; + } /* Has the page moved? */ if (unlikely(page != *((void **)pages[i]))) { @@ -904,8 +918,11 @@ repeat: if (unlikely(page == RADIX_TREE_RETRY)) goto restart; - if (!page_cache_get_speculative(page)) + if (!page_cache_get_speculative(page)) { + /* barrier: see find_get_pages() */ + barrier(); goto repeat; + } /* Has the page moved? */ if (unlikely(page != *((void **)pages[i]))) { From torvalds@linux-foundation.org Mon Jan 5 11:31:24 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_21 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n05HVH9U005624 for ; Mon, 5 Jan 2009 11:31:24 -0600 X-ASG-Debug-ID: 1231176675-498e00c40000-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 EB8DC61000 for ; Mon, 5 Jan 2009 09:31:15 -0800 (PST) Received: from smtp1.linux-foundation.org (smtp1.linux-foundation.org [140.211.169.13]) by cuda.sgi.com with ESMTP id HAX8fUbyEUQL3lBN for ; Mon, 05 Jan 2009 09:31:15 -0800 (PST) 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 n05HUuWG029737 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 5 Jan 2009 09:30:57 -0800 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 n05HUtLu012086; Mon, 5 Jan 2009 09:30:55 -0800 Date: Mon, 5 Jan 2009 09:30:55 -0800 (PST) From: Linus Torvalds X-X-Sender: torvalds@localhost.localdomain To: Nick Piggin cc: Peter Klotz , stable@kernel.org, Linux Memory Management List , Christoph Hellwig , Roman Kononov , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Andrew Morton X-ASG-Orig-Subj: Re: [patch] mm: fix lockless pagecache reordering bug (was Re: BUG: soft lockup - is this XFS problem?) Subject: Re: [patch] mm: fix lockless pagecache reordering bug (was Re: BUG: soft lockup - is this XFS problem?) In-Reply-To: <20090105164135.GC32675@wotan.suse.de> Message-ID: References: <20081223171259.GA11945@infradead.org> <20081230042333.GC27679@wotan.suse.de> <20090103214443.GA6612@infradead.org> <20090105014821.GA367@wotan.suse.de> <20090105041959.GC367@wotan.suse.de> <20090105064838.GA5209@wotan.suse.de> <49623384.2070801@aon.at> <20090105164135.GC32675@wotan.suse.de> 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: 1231176675 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14494 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, 5 Jan 2009, Nick Piggin wrote: > > This patch should be applied to 2.6.29 and 27/28 stable kernels, please. No. I think this patch is utter crap. But please feel free to educate me on why that is not the case. Here's my explanation: Not only is it ugly (which is already sufficient ground to suspect it is wrong or could at least be done better), but reading the comment, it makes no sense at all. You only put the barrier in the "goto repeat" case, but the thing is, if you worry about radix tree slot not being reloaded in the repeat case, then you damn well should worry about it not being reloaded in the non-repeat case too! The code is immediately followed by a test to see that the page is still the same in the slot, ie this: /* * Has the page moved? * This is part of the lockless pagecache protocol. See * include/linux/pagemap.h for details. */ if (unlikely(page != *pagep)) { and if you need a barrier for the repeat case, you need one for this case too. In other words, it looks like you fixed the symptom, but not the real cause! That's now how we work in the kernel. The real cause, btw, appears to be that radix_tree_deref_slot() is a piece of slimy sh*t, and has not been correctly updated to RCU. The proper fix doesn't require any barriers that I can see - I think the proper fix is this simple one-liner. If you use RCU to protect a data structure, then any data loaded from that data structure that can change due to RCU should be loaded with "rcu_dereference()". Now, I can't test this, because it makes absolutely no difference for me (the diff isn't empty, but the asm changes seem to be all due to just gcc variable numbering changing). I can't seem to see the buggy code. Maybe it needs a specific compiler version, or some specific config option to trigger? So because I can't see the issue, I also obviously can't verify that it's the only possible case. Maybe there is some other memory access that should also be done with the proper rcu accessors? Of course, it's also possible that we should just put a barrier in page_cache_get_speculative(). That doesn't seem to make a whole lot of conceptual sense, though (the same way that your barrier() didn't make any sense - I don't see that the barrier has absolutely _anything_ to do with whether the speculative getting of the page fails or not!) In general, I'd like fewer "band-aid" patches, and more "deep thinking" patches. I'm not saying mine is very deep either, but I think it's at least scrathing the surface of the real problem rather than just trying to cover it up. Linus --- include/linux/radix-tree.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/include/linux/radix-tree.h b/include/linux/radix-tree.h index a916c66..355f6e8 100644 --- a/include/linux/radix-tree.h +++ b/include/linux/radix-tree.h @@ -136,7 +136,7 @@ do { \ */ static inline void *radix_tree_deref_slot(void **pslot) { - void *ret = *pslot; + void *ret = rcu_dereference(*pslot); if (unlikely(radix_tree_is_indirect_ptr(ret))) ret = RADIX_TREE_RETRY; return ret; From npiggin@suse.de Mon Jan 5 12:00:12 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_21 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n05I0Bvu007269 for ; Mon, 5 Jan 2009 12:00:12 -0600 X-ASG-Debug-ID: 1231178410-0d5202900000-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 1BCC5612B7 for ; Mon, 5 Jan 2009 10:00:10 -0800 (PST) Received: from mx1.suse.de (ns1.suse.de [195.135.220.2]) by cuda.sgi.com with ESMTP id 9DtsGI8Qq0RpFYWv for ; Mon, 05 Jan 2009 10:00:10 -0800 (PST) X-ASG-Whitelist: Barracuda Reputation Received: from Relay1.suse.de (relay-ext.suse.de [195.135.221.8]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 1B84D4585C; Mon, 5 Jan 2009 19:00:09 +0100 (CET) Date: Mon, 5 Jan 2009 19:00:08 +0100 From: Nick Piggin To: Linus Torvalds Cc: Peter Klotz , stable@kernel.org, Linux Memory Management List , Christoph Hellwig , Roman Kononov , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Andrew Morton X-ASG-Orig-Subj: Re: [patch] mm: fix lockless pagecache reordering bug (was Re: BUG: soft lockup - is this XFS problem?) Subject: Re: [patch] mm: fix lockless pagecache reordering bug (was Re: BUG: soft lockup - is this XFS problem?) Message-ID: <20090105180008.GE32675@wotan.suse.de> References: <20081223171259.GA11945@infradead.org> <20081230042333.GC27679@wotan.suse.de> <20090103214443.GA6612@infradead.org> <20090105014821.GA367@wotan.suse.de> <20090105041959.GC367@wotan.suse.de> <20090105064838.GA5209@wotan.suse.de> <49623384.2070801@aon.at> <20090105164135.GC32675@wotan.suse.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.9i X-Barracuda-Connect: ns1.suse.de[195.135.220.2] X-Barracuda-Start-Time: 1231178411 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com On Mon, Jan 05, 2009 at 09:30:55AM -0800, Linus Torvalds wrote: > > > On Mon, 5 Jan 2009, Nick Piggin wrote: > > > > This patch should be applied to 2.6.29 and 27/28 stable kernels, please. > > No. I think this patch is utter crap. But please feel free to educate me > on why that is not the case. > > Here's my explanation: > > Not only is it ugly (which is already sufficient ground to suspect it is > wrong or could at least be done better), but reading the comment, it makes > no sense at all. You only put the barrier in the "goto repeat" case, but > the thing is, if you worry about radix tree slot not being reloaded in the > repeat case, then you damn well should worry about it not being reloaded > in the non-repeat case too! In which case atomic_inc_unless is defined to provide a barrier. > The code is immediately followed by a test to see that the page is still > the same in the slot, ie this: > > /* > * Has the page moved? > * This is part of the lockless pagecache protocol. See > * include/linux/pagemap.h for details. > */ > if (unlikely(page != *pagep)) { > > and if you need a barrier for the repeat case, you need one for this case > too. > > In other words, it looks like you fixed the symptom, but not the real > cause! That's now how we work in the kernel. > > The real cause, btw, appears to be that radix_tree_deref_slot() is a piece > of slimy sh*t, and has not been correctly updated to RCU. The proper fix > doesn't require any barriers that I can see - I think the proper fix is > this simple one-liner. > > If you use RCU to protect a data structure, then any data loaded from that > data structure that can change due to RCU should be loaded with > "rcu_dereference()". It doesn't need that because the last level pointers in the radix tree are not necessarily under RCU, but whatever synchronisation the caller uses (in this case, speculative page references, which should not require smp_read_barrier_depends, AFAIKS). Putting an rcu_dereference there might work, but I think it misses a subtlety of this code. > Now, I can't test this, because it makes absolutely no difference for me > (the diff isn't empty, but the asm changes seem to be all due to just gcc > variable numbering changing). I can't seem to see the buggy code. Maybe it > needs a specific compiler version, or some specific config option to > trigger? > > So because I can't see the issue, I also obviously can't verify that it's > the only possible case. Maybe there is some other memory access that > should also be done with the proper rcu accessors? > > Of course, it's also possible that we should just put a barrier in > page_cache_get_speculative(). That doesn't seem to make a whole lot of > conceptual sense, though (the same way that your barrier() didn't make any > sense - I don't see that the barrier has absolutely _anything_ to do with > whether the speculative getting of the page fails or not!) When that fails, the caller can (almost) assume the pointer has changed. So it has to load the new pointer to continue. The object pointed to is not protected with RCU, nor is there a requirement to see a specific load execution ordering. > > In general, I'd like fewer "band-aid" patches, and more "deep thinking" > patches. I'm not saying mine is very deep either, but I think it's at > least scrathing the surface of the real problem rather than just trying to > cover it up. From tritium_helium@hotmail.com Mon Jan 5 13:05:07 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.1 required=5.0 tests=BAYES_50,HTML_MESSAGE, J_CHICKENPOX_43 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n05J564S011036 for ; Mon, 5 Jan 2009 13:05:07 -0600 X-ASG-Debug-ID: 1231182301-32d6020f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bay0-omc2-s9.bay0.hotmail.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3C6CC17A8A6A for ; Mon, 5 Jan 2009 11:05:02 -0800 (PST) Received: from bay0-omc2-s9.bay0.hotmail.com (bay0-omc2-s9.bay0.hotmail.com [65.54.246.145]) by cuda.sgi.com with ESMTP id NmxPUxHE0yYX431b for ; Mon, 05 Jan 2009 11:05:02 -0800 (PST) Received: from BAY123-W14 ([207.46.11.49]) by bay0-omc2-s9.bay0.hotmail.com with Microsoft SMTPSVC(6.0.3790.3959); Mon, 5 Jan 2009 11:04:30 -0800 Message-ID: X-Originating-IP: [82.233.133.236] From: Tritium Tritium To: X-ASG-Orig-Subj: retrocompatibility XFS 2.10.1 with 2.8.1 ? Subject: retrocompatibility XFS 2.10.1 with 2.8.1 ? Date: Mon, 5 Jan 2009 19:04:30 +0000 Importance: Normal MIME-Version: 1.0 X-OriginalArrivalTime: 05 Jan 2009 19:04:30.0908 (UTC) FILETIME=[705B3FC0:01C96F68] X-Barracuda-Connect: bay0-omc2-s9.bay0.hotmail.com[65.54.246.145] X-Barracuda-Start-Time: 1231182306 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0086 1.0000 -1.9648 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.96 X-Barracuda-Spam-Status: No, SCORE=-1.96 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14500 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message Content-Type: text/plain Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-length: 1126 HI ! In first, I 'm a french user and sorry for my very bad english ... For an Adsl Box, I want to partitionning and format my external hard disk d= rive under XFS .What a good idea , isn't it ? ;o) I get my Mandriva One (I know it isn't a "professionnal" distribution but y= ou know the French search the simple thing !) and use fdisk -l , gparted an= d mkfs.xfs /dev/xxx . With this, the adsl box reboot ! And of course it doesn't recognize the par= tition. I tried with a Debian Etch XFS ... and this is a SUCCESS ! When I compare XFS versions I find a 2.10.1 for Mandriva and 2.8.1 for Debi= an. Why the same command under two differents versions produce two format incom= patible ? Why the XFS 2.10.1 version is not compatible with the 2.8.1 ? It's a trap for newbie who get a old hardware under linux ... Thanks for your patience . Reguards Vince. _________________________________________________________________ T=E9l=E9phonez gratuitement =E0 tous vos proches avec Windows Live Messenge= r=A0 !=A0 T=E9l=E9chargez-le maintenant ! http://www.windowslive.fr/messenger/1.asp [[HTML alternate version deleted]] From SRS0+078186c4fdf4bbd729b5+1961+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 5 13:31:32 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n05JVUYk013559 for ; Mon, 5 Jan 2009 13:31:32 -0600 X-ASG-Debug-ID: 1231183889-5cea00410000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D3C4E17A8684 for ; Mon, 5 Jan 2009 11:31:29 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id zCWtbErP3M0YLK2y for ; Mon, 05 Jan 2009 11:31:29 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LJvAf-0005Dh-2Q for xfs@oss.sgi.com; Mon, 05 Jan 2009 19:31:29 +0000 Date: Mon, 5 Jan 2009 14:31:29 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] define xfs_ino_t as unsigned long long Subject: [PATCH] define xfs_ino_t as unsigned long long Message-ID: <20090105193129.GA19909@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-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: 1231183889 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com That way we can avoid ugly casts when printining it (like the ones that show up on powerpc with Linus' current tree). Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/xfs_types.h =================================================================== --- xfs.orig/fs/xfs/xfs_types.h 2009-01-01 11:53:17.321546620 +0100 +++ xfs/fs/xfs/xfs_types.h 2009-01-05 20:30:04.794549213 +0100 @@ -45,7 +45,7 @@ typedef __uint32_t prid_t; /* project typedef __uint32_t inst_t; /* an instruction */ typedef __s64 xfs_off_t; /* type */ -typedef __u64 xfs_ino_t; /* type */ +typedef unsigned long long xfs_ino_t; /* type */ typedef __s64 xfs_daddr_t; /* type */ typedef char * xfs_caddr_t; /* type */ typedef __u32 xfs_dev_t; From torvalds@linux-foundation.org Mon Jan 5 13:32:35 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n05JWZt4013664 for ; Mon, 5 Jan 2009 13:32:35 -0600 X-ASG-Debug-ID: 1231183952-5ce7004d0000-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 C870717A86FC for ; Mon, 5 Jan 2009 11:32:33 -0800 (PST) Received: from smtp1.linux-foundation.org (smtp1.linux-foundation.org [140.211.169.13]) by cuda.sgi.com with ESMTP id piPCHMk0fsfF7qDR for ; Mon, 05 Jan 2009 11:32:33 -0800 (PST) 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 n05IiSjG001741 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 5 Jan 2009 10:44:29 -0800 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 n05IiRh1006722; Mon, 5 Jan 2009 10:44:27 -0800 Date: Mon, 5 Jan 2009 10:44:27 -0800 (PST) From: Linus Torvalds X-X-Sender: torvalds@localhost.localdomain To: Nick Piggin cc: Peter Klotz , stable@kernel.org, Linux Memory Management List , Christoph Hellwig , Roman Kononov , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Andrew Morton X-ASG-Orig-Subj: Re: [patch] mm: fix lockless pagecache reordering bug (was Re: BUG: soft lockup - is this XFS problem?) Subject: Re: [patch] mm: fix lockless pagecache reordering bug (was Re: BUG: soft lockup - is this XFS problem?) In-Reply-To: <20090105180008.GE32675@wotan.suse.de> Message-ID: References: <20081223171259.GA11945@infradead.org> <20081230042333.GC27679@wotan.suse.de> <20090103214443.GA6612@infradead.org> <20090105014821.GA367@wotan.suse.de> <20090105041959.GC367@wotan.suse.de> <20090105064838.GA5209@wotan.suse.de> <49623384.2070801@aon.at> <20090105164135.GC32675@wotan.suse.de> <20090105180008.GE32675@wotan.suse.de> 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: 1231183954 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14502 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, 5 Jan 2009, Nick Piggin wrote: > On Mon, Jan 05, 2009 at 09:30:55AM -0800, Linus Torvalds wrote: > > > > Not only is it ugly (which is already sufficient ground to suspect it is > > wrong or could at least be done better), but reading the comment, it makes > > no sense at all. You only put the barrier in the "goto repeat" case, but > > the thing is, if you worry about radix tree slot not being reloaded in the > > repeat case, then you damn well should worry about it not being reloaded > > in the non-repeat case too! > > In which case atomic_inc_unless is defined to provide a barrier. Hmm. Ok, granted. > > If you use RCU to protect a data structure, then any data loaded from that > > data structure that can change due to RCU should be loaded with > > "rcu_dereference()". > > It doesn't need that because the last level pointers in the radix > tree are not necessarily under RCU, but whatever synchronisation > the caller uses (in this case, speculative page references, which > should not require smp_read_barrier_depends, AFAIKS). rcu_dereference() does more than that smp_read_barrier_depends() (which is a no-op on all sane architectures). The important part of rcu_dereference() is the ACCESS_ONCE() part. That's the one that guarantees the access to happen - exactly once. > Putting an rcu_dereference there might work, but I think it misses a > subtlety of this code. No, _you_ miss the subtlety of something that can change under you. Look at radix_tree_deref_slot(), and realize that without the rcu_dereference(), the compiler would actually be allowed to think that it can re-load anything from *pslot several times. So without my one-liner patch, the compiler can actually do this: register = load_from_memory(pslot) if (radix_tree_is_indirect_ptr(register)) goto fail: return load_from_memory(pslot); fail: return RADIX_TREE_RETRY; see? Imagine if you are low on registers (x86, anyone?) and look at that radix_tree_is_indirect_ptr() test: it does a logical "and" which can be done with a memory instruction on x86. So the compiler could _literally_ compile this as testb $1,(%eax) ; %eax is "pslot" jne indirect_pointer movl (%eax),%eax ; now we load it for real rather than movl (%eax),%eax testl $1,%eax jne indirect_pointer because the first version actually keeps more registers live for the indirect case. In fact, the compiler might be delaying that "movl" until much later (depending on barriers and needs). And notice how that "now we load it for real" may be getting a new value - including a possible indirect pointer value, even though we tested that it wasn't an indirect pointer! And THIS is why code that depends on RCU needs to use "rcu_dereference()". Because otherwise you may be testing one thing, and then later using some _other_ value than the one you tested. You must guarantee that you really just load it once, and that the compiler doesn't decide that it can load it multiple times, and test the multiple (possibly different) values using different logic. > > Of course, it's also possible that we should just put a barrier in > > page_cache_get_speculative(). That doesn't seem to make a whole lot of > > conceptual sense, though (the same way that your barrier() didn't make any > > sense - I don't see that the barrier has absolutely _anything_ to do with > > whether the speculative getting of the page fails or not!) > > When that fails, the caller can (almost) assume the pointer has changed. Not relevant. Yes, when it fails, the caller can obviously assume that the pointer has almost certainly changed, but that's neither here nor there - if the page_cache_get_speculative() fails, you mustn't use that pointer *whether* it has changed or not. So there's no point in even testing, and the code obviously doesn't. > So it has to load the new pointer to continue. The object pointed to is > not protected with RCU, nor is there a requirement to see a specific > load execution ordering. Either the value can change, or it can not. It's that simple. If it cannot change, then we can load it just once, or we can load it multiple times, and it won't matter. Barriers won't do anything but screw up the code. If it can change from under us, you need to use rcu_dereference(), or open-code it with an ACCESS_ONCE() or put in barriers. But your placement of a barrier was NONSENSICAL. Your barrier didn't protect anything else - like the test for the RADIX_TREE_INDIRECT_PTR bit. And that was the fundamental problem. And once you fix that fundamental problem, your barrier no longer makes any sense, because the barrier HAS NOTHING TO DO WITH WHETHER page_cache_get_speculative() fails or not! Linus From torvalds@linux-foundation.org Mon Jan 5 13:39:46 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n05JdkMh014091 for ; Mon, 5 Jan 2009 13:39:46 -0600 X-ASG-Debug-ID: 1231184385-5eee00540000-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 952A017A90D7 for ; Mon, 5 Jan 2009 11:39:45 -0800 (PST) Received: from smtp1.linux-foundation.org (smtp1.linux-foundation.org [140.211.169.13]) by cuda.sgi.com with ESMTP id c2GBYmi40tAtHqB8 for ; Mon, 05 Jan 2009 11:39:45 -0800 (PST) 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 n05JdUCq005369 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 5 Jan 2009 11:39:31 -0800 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 n05JdTtR019125; Mon, 5 Jan 2009 11:39:29 -0800 Date: Mon, 5 Jan 2009 11:39:29 -0800 (PST) From: Linus Torvalds X-X-Sender: torvalds@localhost.localdomain To: Nick Piggin cc: Peter Klotz , stable@kernel.org, Linux Memory Management List , Christoph Hellwig , Roman Kononov , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Andrew Morton X-ASG-Orig-Subj: Re: [patch] mm: fix lockless pagecache reordering bug (was Re: BUG: soft lockup - is this XFS problem?) Subject: Re: [patch] mm: fix lockless pagecache reordering bug (was Re: BUG: soft lockup - is this XFS problem?) In-Reply-To: Message-ID: References: <20081223171259.GA11945@infradead.org> <20081230042333.GC27679@wotan.suse.de> <20090103214443.GA6612@infradead.org> <20090105014821.GA367@wotan.suse.de> <20090105041959.GC367@wotan.suse.de> <20090105064838.GA5209@wotan.suse.de> <49623384.2070801@aon.at> <20090105164135.GC32675@wotan.suse.de> <20090105180008.GE32675@wotan.suse.de> 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: 1231184385 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14502 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, 5 Jan 2009, Linus Torvalds wrote: > > Either the value can change, or it can not. It's that simple. > > If it cannot change, then we can load it just once, or we can load it > multiple times, and it won't matter. Barriers won't do anything but screw > up the code. > > If it can change from under us, you need to use rcu_dereference(), or > open-code it with an ACCESS_ONCE() or put in barriers. But your placement > of a barrier was NONSENSICAL. Your barrier didn't protect anything else - > like the test for the RADIX_TREE_INDIRECT_PTR bit. > > And that was the fundamental problem. Btw, this is the real issue with anything that does "locking vs optimistic" accesses. If you use locking, then by definition (if you did things right), the values you are working with do not change. As a result, it doesn't matter if the compiler re-orders accesses, splits them up, or coalesces them. It's why normal code should never need barriers, because it doesn't matter whether some access gets optimized away or gets done multiple times. But whenever you use an optimistic algorithm, and the data may change under you, you need to use barriers or other things to limit the things the CPU and/or compiler does. And yes, "rcu_dereference()" is one such thing - it's not a barrier in the sense that it doesn't necessarily affect ordering of accesses to other variables around it (although the read_barrier_depends() obviously _is_ a very special kind of ordering wrt the pointer itself on alpha). But it does make sure that the compiler at least does not coalesce - or split - that _one_ particular access. It's true that it has "rcu" in its name, and it's also true that that may be a bit misleading in that it's very much useful not just for rcu, but for _any_ algorithm that depends on rcu-like behavior - ie optimistic accesses to data that may change underneath it. RCU is just the most commonly used (and perhaps best codified) variant of that kind of code. Linus From paulmck@paulmck-laptop.linux.vnet.ibm.com Mon Jan 5 14:13:12 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n05KD84Y016119 for ; Mon, 5 Jan 2009 14:13:12 -0600 X-ASG-Debug-ID: 1231186387-658700cd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from e5.ny.us.ibm.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9653862913 for ; Mon, 5 Jan 2009 12:13:08 -0800 (PST) Received: from e5.ny.us.ibm.com (e5.ny.us.ibm.com [32.97.182.145]) by cuda.sgi.com with ESMTP id cyHlDE3WRhpSBmmH for ; Mon, 05 Jan 2009 12:13:08 -0800 (PST) Received: from d01relay02.pok.ibm.com (d01relay02.pok.ibm.com [9.56.227.234]) by e5.ny.us.ibm.com (8.13.1/8.13.1) with ESMTP id n05KBi8X019302 for ; Mon, 5 Jan 2009 15:11:44 -0500 Received: from d01av04.pok.ibm.com (d01av04.pok.ibm.com [9.56.224.64]) by d01relay02.pok.ibm.com (8.13.8/8.13.8/NCO v9.1) with ESMTP id n05KD7F5188708 for ; Mon, 5 Jan 2009 15:13:07 -0500 Received: from d01av04.pok.ibm.com (loopback [127.0.0.1]) by d01av04.pok.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id n05LDA48026184 for ; Mon, 5 Jan 2009 16:13:18 -0500 Received: from paulmck-laptop.localdomain (paulmck-laptop-009047022065.beaverton.ibm.com [9.47.22.65]) by d01av04.pok.ibm.com (8.12.11.20060308/8.12.11) with ESMTP id n05LD9E1026105; Mon, 5 Jan 2009 16:13:09 -0500 Received: by paulmck-laptop.localdomain (Postfix, from userid 1000) id 94F4C14FB40; Mon, 5 Jan 2009 12:12:58 -0800 (PST) Date: Mon, 5 Jan 2009 12:12:58 -0800 From: "Paul E. McKenney" To: Linus Torvalds Cc: Nick Piggin , Peter Klotz , stable@kernel.org, Linux Memory Management List , Christoph Hellwig , Roman Kononov , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Andrew Morton X-ASG-Orig-Subj: Re: [patch] mm: fix lockless pagecache reordering bug (was Re: BUG: soft lockup - is this XFS problem?) Subject: Re: [patch] mm: fix lockless pagecache reordering bug (was Re: BUG: soft lockup - is this XFS problem?) Message-ID: <20090105201258.GN6959@linux.vnet.ibm.com> Reply-To: paulmck@linux.vnet.ibm.com References: <20081230042333.GC27679@wotan.suse.de> <20090103214443.GA6612@infradead.org> <20090105014821.GA367@wotan.suse.de> <20090105041959.GC367@wotan.suse.de> <20090105064838.GA5209@wotan.suse.de> <49623384.2070801@aon.at> <20090105164135.GC32675@wotan.suse.de> <20090105180008.GE32675@wotan.suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.15+20070412 (2007-04-11) X-Barracuda-Connect: e5.ny.us.ibm.com[32.97.182.145] X-Barracuda-Start-Time: 1231186388 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14504 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Jan 05, 2009 at 10:44:27AM -0800, Linus Torvalds wrote: > On Mon, 5 Jan 2009, Nick Piggin wrote: > > On Mon, Jan 05, 2009 at 09:30:55AM -0800, Linus Torvalds wrote: > > Putting an rcu_dereference there might work, but I think it misses a > > subtlety of this code. > > No, _you_ miss the subtlety of something that can change under you. > > Look at radix_tree_deref_slot(), and realize that without the > rcu_dereference(), the compiler would actually be allowed to think that it > can re-load anything from *pslot several times. So without my one-liner > patch, the compiler can actually do this: > > register = load_from_memory(pslot) > if (radix_tree_is_indirect_ptr(register)) > goto fail: > return load_from_memory(pslot); > > fail: > return RADIX_TREE_RETRY; My guess is that Nick believes that the value in *pslot cannot change in such as way as to cause radix_tree_is_indirect_ptr()'s return value to change within a given RCU grace period, and that Linus disagrees. Whatever the answer, I would argue for -at- -least- a comment explaining why it is safe. I am not seeing the objection to rcu_dereference(), but I must confess that it has been awhile since I have looked closely at the radix_tree code. :-/ Thanx, Paul From SRS0+078186c4fdf4bbd729b5+1961+infradead.org+hch@bombadil.srs.infradead.org Mon Jan 5 14:19:44 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n05KJhTE016718 for ; Mon, 5 Jan 2009 14:19:44 -0600 X-ASG-Debug-ID: 1231186783-5d5601440000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9514517A8DD9 for ; Mon, 5 Jan 2009 12:19:43 -0800 (PST) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id yREe4xw18JfcV8xU for ; Mon, 05 Jan 2009 12:19:43 -0800 (PST) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.68 #1 (Red Hat Linux)) id 1LJvvK-0001qe-Ki; Mon, 05 Jan 2009 20:19:42 +0000 Date: Mon, 5 Jan 2009 15:19:42 -0500 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: Arkadiusz Miskiewicz X-ASG-Orig-Subj: [PATCH] xfs_repair: allow filesystems with a single allocation group Subject: [PATCH] xfs_repair: allow filesystems with a single allocation group Message-ID: <20090105201942.GA6960@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-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: 1231186783 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com Currently xfs_repair bails out on a filesystem with just a single AG. But that's a perfectly valid configureation, so we should allow it. Because we could cause harm only allow it when using the force_geometry suboption. But we nice enough to tell the user about it when he needs it. Also make sure to take the internal log into account when guestimating the first inode cluster offset. I'll also cook up a testcase for repair on single AG filesystems. Signed-off-by: Christoph Hellwig Reported-By: Arkadiusz Miskiewicz Index: xfsprogs-dev/repair/sb.c =================================================================== --- xfsprogs-dev.orig/repair/sb.c 2009-01-03 21:57:42.415546683 +0100 +++ xfsprogs-dev/repair/sb.c 2009-01-05 21:19:01.706752325 +0100 @@ -760,27 +760,37 @@ verify_set_primary_sb(xfs_sb_t *rsb, switch (num_sbs) { case 2: /* - * all them have to be right. if not, report geometry - * and get out unless force option is in effect (-F) + * If we only have two allocation groups, and the superblock + * in the second allocation group differs from the primary + * superblock we can't verify the geometry information. + * Warn the user about this situation and get out unless + * explicitly overridden. */ if (current->refs != 2) { if (!force_geo) { do_warn( - _("Only two AGs detected and they do not match - cannot proceed.\n")); + _("Only two AGs detected and they do not match - " + "cannot validate filesystem geometry.\n" + "Use the -o force_geometry option to proceed.\n")); exit(1); } } - break; + goto out_free_list; case 1: /* - * just report the geometry info and get out. - * refuse to run further unless the force (-F) - * option is in effect. + * If we only have a single allocation group there is no + * secondary superblock that we can use to verify the geometry + * information. Warn the user about this situation and get + * out unless explicitly overridden. */ if (!force_geo) { - do_warn(_("Only one AG detected - cannot proceed.\n")); + do_warn( + _("Only one AG detected - " + "cannot validate filesystem geometry.\n" + "Use the -o force_geometry option to proceed.\n")); exit(1); } + goto out_free_list; default: /* * at least half of the probed superblocks have @@ -820,6 +830,7 @@ verify_set_primary_sb(xfs_sb_t *rsb, sb_width = sb->sb_width; } +out_free_list: free_geo(list); out: free(sb); Index: xfsprogs-dev/repair/xfs_repair.c =================================================================== --- xfsprogs-dev.orig/repair/xfs_repair.c 2009-01-03 21:57:42.416547229 +0100 +++ xfsprogs-dev/repair/xfs_repair.c 2009-01-05 20:53:24.810738262 +0100 @@ -62,6 +62,8 @@ char *o_opts[] = { "bhash", #define AG_STRIDE 4 "ag_stride", +#define FORCE_GEO 5 + "force_geometry", NULL }; @@ -258,6 +260,13 @@ process_args(int argc, char **argv) case AG_STRIDE: ag_stride = (int)strtol(val, NULL, 0); break; + case FORCE_GEO: + if (val) + noval('o', o_opts, FORCE_GEO); + if (force_geo) + respec('o', o_opts, FORCE_GEO); + force_geo = 1; + break; default: unknown('o', val); break; @@ -409,6 +418,19 @@ calc_mkfs(xfs_mount_t *mp) fino_bno = inobt_root + XFS_MIN_FREELIST_RAW(1, 1, mp) + 1; /* + * If we only have a single allocation group the log is also allocated + * in the first allocation group and we need to add the number of + * blocks used by the log to the above calculation. + * All this of course doesn't apply if we have an external log. + */ + if (mp->m_sb.sb_agcount == 1 && mp->m_sb.sb_logstart) { + /* + * XXX(hch): verify that sb_logstart makes sense? + */ + fino_bno += mp->m_sb.sb_logblocks; + } + + /* * ditto the location of the first inode chunks in the fs ('/') */ if (xfs_sb_version_hasdalign(&mp->m_sb) && do_inoalign) { Index: xfsprogs-dev/man/man8/xfs_repair.8 =================================================================== --- xfsprogs-dev.orig/man/man8/xfs_repair.8 2009-01-05 21:11:50.054546919 +0100 +++ xfsprogs-dev/man/man8/xfs_repair.8 2009-01-05 21:14:49.228027165 +0100 @@ -146,6 +146,15 @@ RAM size. This creates additional processing threads to parallel process AGs that span multiple concat units. This can significantly reduce repair times on concat based filesystems. +.TP +.BI force_geometry +Check the filesystem even if geometry information could not be validate. +Geometry information can not be validated if there is only a single +allocation group exists and thus no backups superblock exists, or +if there are two allocation groups and the two superblocks do not +agree on the filesystem geometry. Only use this option if you validated +the geometry yourself and know what your doing. In doubt do a run +in no modify mode first. .RE .TP .B \-t " interval" From torvalds@linux-foundation.org Mon Jan 5 14:40:15 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n05KeBPA017759 for ; Mon, 5 Jan 2009 14:40:15 -0600 X-ASG-Debug-ID: 1231188009-499003740000-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 D134262B68 for ; Mon, 5 Jan 2009 12:40:10 -0800 (PST) Received: from smtp1.linux-foundation.org (smtp1.linux-foundation.org [140.211.169.13]) by cuda.sgi.com with ESMTP id IqKRXJ5UBsu5DWAH for ; Mon, 05 Jan 2009 12:40:10 -0800 (PST) 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 n05KdHPO009614 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 5 Jan 2009 12:39:18 -0800 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 n05KdEU9003036; Mon, 5 Jan 2009 12:39:15 -0800 Date: Mon, 5 Jan 2009 12:39:14 -0800 (PST) From: Linus Torvalds X-X-Sender: torvalds@localhost.localdomain To: "Paul E. McKenney" cc: Nick Piggin , Peter Klotz , stable@kernel.org, Linux Memory Management List , Christoph Hellwig , Roman Kononov , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Andrew Morton X-ASG-Orig-Subj: Re: [patch] mm: fix lockless pagecache reordering bug (was Re: BUG: soft lockup - is this XFS problem?) Subject: Re: [patch] mm: fix lockless pagecache reordering bug (was Re: BUG: soft lockup - is this XFS problem?) In-Reply-To: <20090105201258.GN6959@linux.vnet.ibm.com> Message-ID: References: <20081230042333.GC27679@wotan.suse.de> <20090103214443.GA6612@infradead.org> <20090105014821.GA367@wotan.suse.de> <20090105041959.GC367@wotan.suse.de> <20090105064838.GA5209@wotan.suse.de> <49623384.2070801@aon.at> <20090105164135.GC32675@wotan.suse.de> <20090105180008.GE32675@wotan.suse.de> <20090105201258.GN6959@linux.vnet.ibm.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: 1231188010 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14506 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, 5 Jan 2009, Paul E. McKenney wrote: > > My guess is that Nick believes that the value in *pslot cannot change > in such as way as to cause radix_tree_is_indirect_ptr()'s return value > to change within a given RCU grace period, and that Linus disagrees. Oh, it's entirely possible that there are some lifetime rules or others that make it impossible for things to go from "not indirect" -> "indirect". So if that was Nick's point, then I'm not "disagreeing" per se. What I'm disagreeing about is that Nick apparently thinks that this is all subtle code, and as a result we should add barriers in some very non-obvious places. While _I_ think that the problem isn't properly solved by barriers, but by just making the code less subtle. If the barrier only exists because of the reload issue, then the obvious solution - to me - is to just use what is already the proper accessor function that forces a nice reload. That way the compiler is forced to create code that does what the source clearly means it to do, regardless of any barriers at all. Barriers in general should be the _last_ thing added. And if they are added, they should be added as deeply in the call-chain as possible, so that we don't need to add them in multiple call-sites. Again, using the rcu_dereference() approach seems to solve that issue too - rather than add three barriers in three different places, we just add the proper dereference in _one_ place. > Whatever the answer, I would argue for -at- -least- a comment explaining > why it is safe. I am not seeing the objection to rcu_dereference(), but > I must confess that it has been awhile since I have looked closely at > the radix_tree code. :-/ And I'm actually suprised that gcc can generate the problematic code in the first place. I'd expect that a "atomic_add_unless()" would always be at LEAST a compiler barrier, even if it isn't necessarily a CPU memory barrier. But because we inline it, and because we allow gcc to see that it doesn't do anything if it gets just the right value from memory, I guess gcc ends up able to change the "for()" loop so that the first iteration can exit specially, and then for that case (and no other case) it can cache variables over the whole atomic_add_unless(). Again, that's very fragile. The fact that Documentation/atomic_ops.txt says that the failure case doesn't contain any barriers is really _meant_ to be about the architecture-specific CPU barriers, not so much about something as simple as a compiler re-ordering. So while I think that we should use rcu_dereference() (regardless of any other issues), I _also_ think that part of the problem really is the excessive subtlety in the whole code, and the (obviously very surprising) fact that gcc could end up caching an unrelated memory load across that whole atomic op. Maybe we should make atomics always imply a compiler barrier, even when they do not imply a memory barrier. The one exception would be the (special) case of "atomic_read()/atomic_set()", which don't really do any kind of complex operation at all, and where we really do want the compiler to be able to coalesce multiple atomic_reads() to a single one. In contrast, there's no sense in allowing the compiler to coalesce a "atomic_add_unless()" with anything else. Making it a compiler barrier (possibly by uninlining it, or just adding a barrier to it) would also have avoided the whole subtle case - which is always a good thing. Linus From peterz@infradead.org Mon Jan 5 15:05:08 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n05L58Mc019339 for ; Mon, 5 Jan 2009 15:05:08 -0600 X-ASG-Debug-ID: 1231189502-661501750000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from casper.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 30C9C62AD6 for ; Mon, 5 Jan 2009 13:05:02 -0800 (PST) Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id 6CzFDagGm3XErTF1 for ; Mon, 05 Jan 2009 13:05:02 -0800 (PST) Received: from d9244.upc-d.chello.nl ([213.46.9.244] helo=twins) by casper.infradead.org with esmtpsa (Exim 4.69 #1 (Red Hat Linux)) id 1LJwd1-0004gx-Eo; Mon, 05 Jan 2009 21:04:51 +0000 Received: by twins (Postfix, from userid 1000) id 8E1F41813EF70; Mon, 5 Jan 2009 22:04:51 +0100 (CET) X-ASG-Orig-Subj: Re: [patch] mm: fix lockless pagecache reordering bug (was Re: Subject: Re: [patch] mm: fix lockless pagecache reordering bug (was Re: From: Peter Zijlstra To: paulmck@linux.vnet.ibm.com Cc: Linus Torvalds , Nick Piggin , Peter Klotz , stable@kernel.org, Linux Memory Management List , Christoph Hellwig , Roman Kononov , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Andrew Morton In-Reply-To: <20090105201258.GN6959@linux.vnet.ibm.com> References: <20081230042333.GC27679@wotan.suse.de> <20090103214443.GA6612@infradead.org> <20090105014821.GA367@wotan.suse.de> <20090105041959.GC367@wotan.suse.de> <20090105064838.GA5209@wotan.suse.de> <49623384.2070801@aon.at> <20090105164135.GC32675@wotan.suse.de> <20090105180008.GE32675@wotan.suse.de> <20090105201258.GN6959@linux.vnet.ibm.com> Content-Type: text/plain Content-Transfer-Encoding: 7bit Date: Mon, 05 Jan 2009 22:04:51 +0100 Message-Id: <1231189491.11687.22.camel@twins> Mime-Version: 1.0 X-Mailer: Evolution 2.24.2 X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1231189508 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14508 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, 2009-01-05 at 12:12 -0800, Paul E. McKenney wrote: > On Mon, Jan 05, 2009 at 10:44:27AM -0800, Linus Torvalds wrote: > > On Mon, 5 Jan 2009, Nick Piggin wrote: > > > On Mon, Jan 05, 2009 at 09:30:55AM -0800, Linus Torvalds wrote: > > > Putting an rcu_dereference there might work, but I think it misses a > > > subtlety of this code. > > > > No, _you_ miss the subtlety of something that can change under you. > > > > Look at radix_tree_deref_slot(), and realize that without the > > rcu_dereference(), the compiler would actually be allowed to think that it > > can re-load anything from *pslot several times. So without my one-liner > > patch, the compiler can actually do this: > > > > register = load_from_memory(pslot) > > if (radix_tree_is_indirect_ptr(register)) > > goto fail: > > return load_from_memory(pslot); > > > > fail: > > return RADIX_TREE_RETRY; > > My guess is that Nick believes that the value in *pslot cannot change > in such as way as to cause radix_tree_is_indirect_ptr()'s return value > to change within a given RCU grace period, and that Linus disagrees. Nick's belief would indeed be true IFF all modifying ops including all uses of radix_tree_replace_slot() are serialized wrt. each other. However, since radix_tree_deref_slot() is the counterpart of radix_tree_replace_slot(), one would indeed expect rcu_dereference() therein, much like Linus suggests. While what Nick says is true, the lifetime management of the data objects is arranged externally from the radix tree -- I still think we need the rcu_dereference() even for that argument, as we want to support RCU lifetime management as well. From rick@powerpointseo.com Mon Jan 5 15:42:42 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=4.0 required=5.0 tests=BAYES_50, RCVD_IN_BL_SPAMCOP_NET,RCVD_IN_PSBL autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n05LggZB021152 for ; Mon, 5 Jan 2009 15:42:42 -0600 X-ASG-Debug-ID: 1231191759-6615025e0001-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from 1-jiiod2uwfk09e (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 1AE346300C for ; Mon, 5 Jan 2009 13:42:40 -0800 (PST) Received: from 1-jiiod2uwfk09e ([61.138.185.198]) by cuda.sgi.com with SMTP id WQLWFz1twRkhzLOJ for ; Mon, 05 Jan 2009 13:42:40 -0800 (PST) From: "Rick Garrison" To: "Linux-xfs" X-ASG-Orig-Subj: your site Subject: your site Date: Mon, 5 Jan 2009 13:42:42 -0800 Reply-To: "Rick Garrison" Message-ID: <74740470.20090105134242@powerpointseo.com> X-Priority: 3 (Normal) MIME-Version: 1.0 Content-Type: text/plain; charset="ISO-8859-1" X-Barracuda-Connect: UNKNOWN[61.138.185.198] X-Barracuda-Start-Time: 1231191762 X-Barracuda-Bayes: INNOCENT GLOBAL 0.2418 1.0000 -0.6150 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.30 X-Barracuda-Spam-Status: No, SCORE=0.30 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MIME_QP_LONG_LINE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14510 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.82 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id n05LggZB021152 We can put your site at the top of a search engines listings. If this is something you might be interested in, send me a reply with the web addresses you want to promote and the best way to contact you with some options. Sincerely, Rick Garrison PowerPoint SEO From paulmck@paulmck-laptop.linux.vnet.ibm.com Mon Jan 5 15:58:35 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n05LwZJQ022183 for ; Mon, 5 Jan 2009 15:58:35 -0600 X-ASG-Debug-ID: 1231192713-658502ba0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from e1.ny.us.ibm.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A4D0962EF1 for ; Mon, 5 Jan 2009 13:58:34 -0800 (PST) Received: from e1.ny.us.ibm.com (e1.ny.us.ibm.com [32.97.182.141]) by cuda.sgi.com with ESMTP id BAipruWH0C1Ps8Tv for ; Mon, 05 Jan 2009 13:58:34 -0800 (PST) Received: from d01relay04.pok.ibm.com (d01relay04.pok.ibm.com [9.56.227.236]) by e1.ny.us.ibm.com (8.13.1/8.13.1) with ESMTP id n05LvNgF003303 for ; Mon, 5 Jan 2009 16:57:23 -0500 Received: from d01av04.pok.ibm.com (d01av04.pok.ibm.com [9.56.224.64]) by d01relay04.pok.ibm.com (8.13.8/8.13.8/NCO v9.1) with ESMTP id n05LwX12157440 for ; Mon, 5 Jan 2009 16:58:33 -0500 Received: from d01av04.pok.ibm.com (loopback [127.0.0.1]) by d01av04.pok.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id n05MwhOg031100 for ; Mon, 5 Jan 2009 17:58:44 -0500 Received: from paulmck-laptop.localdomain (paulmck-laptop-009047022065.beaverton.ibm.com [9.47.22.65]) by d01av04.pok.ibm.com (8.12.11.20060308/8.12.11) with ESMTP id n05MwgTQ031068; Mon, 5 Jan 2009 17:58:42 -0500 Received: by paulmck-laptop.localdomain (Postfix, from userid 1000) id 3E78A14FB40; Mon, 5 Jan 2009 13:58:31 -0800 (PST) Date: Mon, 5 Jan 2009 13:58:32 -0800 From: "Paul E. McKenney" To: Peter Zijlstra Cc: Linus Torvalds , Nick Piggin , Peter Klotz , stable@kernel.org, Linux Memory Management List , Christoph Hellwig , Roman Kononov , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Andrew Morton X-ASG-Orig-Subj: Re: [patch] mm: fix lockless pagecache reordering bug (was Re: Subject: Re: [patch] mm: fix lockless pagecache reordering bug (was Re: Message-ID: <20090105215832.GR6959@linux.vnet.ibm.com> Reply-To: paulmck@linux.vnet.ibm.com References: <20090105014821.GA367@wotan.suse.de> <20090105041959.GC367@wotan.suse.de> <20090105064838.GA5209@wotan.suse.de> <49623384.2070801@aon.at> <20090105164135.GC32675@wotan.suse.de> <20090105180008.GE32675@wotan.suse.de> <20090105201258.GN6959@linux.vnet.ibm.com> <1231189491.11687.22.camel@twins> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1231189491.11687.22.camel@twins> User-Agent: Mutt/1.5.15+20070412 (2007-04-11) X-Barracuda-Connect: e1.ny.us.ibm.com[32.97.182.141] X-Barracuda-Start-Time: 1231192714 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14511 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Jan 05, 2009 at 10:04:51PM +0100, Peter Zijlstra wrote: > On Mon, 2009-01-05 at 12:12 -0800, Paul E. McKenney wrote: > > On Mon, Jan 05, 2009 at 10:44:27AM -0800, Linus Torvalds wrote: > > > On Mon, 5 Jan 2009, Nick Piggin wrote: > > > > On Mon, Jan 05, 2009 at 09:30:55AM -0800, Linus Torvalds wrote: > > > > Putting an rcu_dereference there might work, but I think it misses a > > > > subtlety of this code. > > > > > > No, _you_ miss the subtlety of something that can change under you. > > > > > > Look at radix_tree_deref_slot(), and realize that without the > > > rcu_dereference(), the compiler would actually be allowed to think that it > > > can re-load anything from *pslot several times. So without my one-liner > > > patch, the compiler can actually do this: > > > > > > register = load_from_memory(pslot) > > > if (radix_tree_is_indirect_ptr(register)) > > > goto fail: > > > return load_from_memory(pslot); > > > > > > fail: > > > return RADIX_TREE_RETRY; > > > > My guess is that Nick believes that the value in *pslot cannot change > > in such as way as to cause radix_tree_is_indirect_ptr()'s return value > > to change within a given RCU grace period, and that Linus disagrees. > > Nick's belief would indeed be true IFF all modifying ops including all > uses of radix_tree_replace_slot() are serialized wrt. each other. > > However, since radix_tree_deref_slot() is the counterpart of > radix_tree_replace_slot(), one would indeed expect rcu_dereference() > therein, much like Linus suggests. > > While what Nick says is true, the lifetime management of the data > objects is arranged externally from the radix tree -- I still think we > need the rcu_dereference() even for that argument, as we want to support > RCU lifetime management as well. Makes sense to me! Thanx, Paul From paulmck@paulmck-laptop.linux.vnet.ibm.com Mon Jan 5 15:57:30 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with ESMTP id n05LvTLt022124 for ; Mon, 5 Jan 2009 15:57:30 -0600 X-ASG-Debug-ID: 1231192648-1c7e00560000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from e5.ny.us.ibm.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 28C9217A9D7C for ; Mon, 5 Jan 2009 13:57:28 -0800 (PST) Received: from e5.ny.us.ibm.com (e5.ny.us.ibm.com [32.97.182.145]) by cuda.sgi.com with ESMTP id LxoPAp7G48bDChch for ; Mon, 05 Jan 2009 13:57:28 -0800 (PST) Received: from d01relay04.pok.ibm.com (d01relay04.pok.ibm.com [9.56.227.236]) by e5.ny.us.ibm.com (8.13.1/8.13.1) with ESMTP id n05Lu4GQ030719 for ; Mon, 5 Jan 2009 16:56:04 -0500 Received: from d01av04.pok.ibm.com (d01av04.pok.ibm.com [9.56.224.64]) by d01relay04.pok.ibm.com (8.13.8/8.13.8/NCO v9.1) with ESMTP id n05LvSjx134750 for ; Mon, 5 Jan 2009 16:57:28 -0500 Received: from d01av04.pok.ibm.com (loopback [127.0.0.1]) by d01av04.pok.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id n05Mvcnt028659 for ; Mon, 5 Jan 2009 17:57:39 -0500 Received: from paulmck-laptop.localdomain (paulmck-laptop-009047022065.beaverton.ibm.com [9.47.22.65]) by d01av04.pok.ibm.com (8.12.11.20060308/8.12.11) with ESMTP id n05MvbmX028650; Mon, 5 Jan 2009 17:57:37 -0500 Received: by paulmck-laptop.localdomain (Postfix, from userid 1000) id 4CE9C14FB40; Mon, 5 Jan 2009 13:57:26 -0800 (PST) Date: Mon, 5 Jan 2009 13:57:27 -0800 From: "Paul E. McKenney" To: Linus Torvalds Cc: Nick Piggin , Peter Klotz , stable@kernel.org, Linux Memory Management List , Christoph Hellwig , Roman Kononov , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Andrew Morton X-ASG-Orig-Subj: Re: [patch] mm: fix lockless pagecache reordering bug (was Re: BUG: soft lockup - is this XFS problem?) Subject: Re: [patch] mm: fix lockless pagecache reordering bug (was Re: BUG: soft lockup - is this XFS problem?) Message-ID: <20090105215727.GQ6959@linux.vnet.ibm.com> Reply-To: paulmck@linux.vnet.ibm.com References: <20090105014821.GA367@wotan.suse.de> <20090105041959.GC367@wotan.suse.de> <20090105064838.GA5209@wotan.suse.de> <49623384.2070801@aon.at> <20090105164135.GC32675@wotan.suse.de> <20090105180008.GE32675@wotan.suse.de> <20090105201258.GN6959@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.15+20070412 (2007-04-11) X-Barracuda-Connect: e5.ny.us.ibm.com[32.97.182.145] X-Barracuda-Start-Time: 1231192649 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.14511 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Jan 05, 2009 at 12:39:14PM -0800, Linus Torvalds wrote: > > > On Mon, 5 Jan 2009, Paul E. McKenney wrote: > > > > My guess is that Nick believes that the value in *